[樹] 判斷完全二叉樹、滿二叉樹 - C語言(嚴蔚敏《數據結構》6.49 )

題目來源:嚴蔚敏《數據結構》C語言版本習題冊 6.49

// 6.49 編寫算法判別給定二叉樹是否爲完全二叉樹
int BiTreeIsComplete(BiTree root) {// 判斷二叉樹是否是完全二叉樹
	// 思路:完全二叉樹的層次遍歷應沒有NULL 或者說 在完全二叉樹包括空指針的層次遍歷中NULL在最後面
	// 操作:對完全二叉樹進行層次遍歷(包括空指針)。若遍歷途中出現空指針,則標記爲flag=1。在遍歷途中如果是非空結點,而且flag=0,則不是二叉樹
	BiTNode *que[MAXSIZE]; int front,rear; //定義一個隊列
	BiTree p;
	int flag=0; //標識前面是否出現過空指針
	
	if (root==NULL) return 1; //臨界條件不要丟:空樹也是完全二叉樹
	
	front=rear=0;
	que[rear]=root; rear=(rear+1)%MAXSIZE; //根指針入隊列
	while (front!=rear) {
		p=que[front]; front=(front+1)%MAXSIZE; //出隊列
		if (p==NULL) { //此指針是空指針
			flag=1; //標記出現過空指針
		} else { //此指針是非空結點
			if (flag) return 0; //之前出現過空指針,不是完全二叉樹
			// 不判斷p的孩子是否爲空指針,直接隊列
			que[rear]=p->lchild; rear=(rear+1)%MAXSIZE; 
			que[rear]=p->rchild; rear=(rear+1)%MAXSIZE;
		}
	}

	return 1;
}
int BiTreeIsFull(BiTree root) {// 判斷二叉樹是否是滿二叉樹
	// 思路:首先它是完全二叉樹,並且結點總數sum=2^n-1
	// 操作:在判斷完全二叉樹的途中記錄結點個數,然後判斷sum=2^n-1是否滿足
	/* 補充知識:判斷數num是否是2^k --> !( num&(num-1) )
	   [理解] 若num是2的k次方,那麼它二進制只有一位是1-->舉例0100。那num-1=0011。0100&0011=0000
	*/
	BiTNode *que[MAXSIZE]; int front,rear;
	BiTree p;
	int flag=0; //標記之前是否出現了空指針
	int sum=0; //結點總數

	front=rear=0;
	que[rear]=root; rear=(rear+1)%MAXSIZE;
	++sum;
	while (front!=rear) {
		p=que[front]; front=(front+1)%MAXSIZE;
		if (p==NULL) flag=1; //出現了空指針
		else {
			if (flag) return 0;
			++sum;
			que[rear]=p->lchild; rear=(rear+1)%MAXISZE;
			que[rear]=p->rchild; rear=(rear+1)%MAXISZE;
		}
	}

	// 檢查sum=2^n-1 --> sum+1是2的n次方
	sum = sum+1;
	if ( !( sum&(sum-1) ) ) return 1; //檢查數num是否爲2的k次方
	else return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章