1. 程式人生 > >[樹] 6.49 判斷完全二叉樹、滿二叉樹 - C語言

[樹] 6.49 判斷完全二叉樹、滿二叉樹 - C語言

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

// 6.49 編寫演算法判別給定二叉樹是否為完全二叉樹
Status BiTreeIsComplete(BiTree T) {
	// 思路:完全二叉樹的層次遍歷應該是沒有NULL的
	// 實現:把所有的結點都入佇列,包括空指標
	BiTNode *queue[maxSize], *p;
	int front,rear;
	int flag=0;
	front=rear=0;
	queue[rear]=T;rear=(rear+1)%maxSize; //入佇列
	while (front!=rear) { //佇列不為空
		p=
queue[front];front=(front+1)%maxSize; //出佇列 if (!p) flag=1; //出現了空指標 else if (flag) return ERROR; //出現了一個非空結點,但前面已經掃描到了空指標,不是完全二叉樹 else { //不管是不是空,都入佇列 queue[rear]=p->lchild;rear=(rear+1)%maxSize; queue[rear]=p->rchild;rear=(rear+1)%maxSize; } } return TRUE; } // 是否為滿二叉樹 Status IsTwoN(int
num) { if ( (num&(num-1)) ) //去掉一個1,判斷是否為0 return ERROR; return TRUE; } Status BiTreeIsFull(BiTree T) { // 先判斷是否為完全二叉樹 // 在上一步的時候得到結點的個數sum,sum=2^n-1 --> 根據這個公式:判斷sum+1是不是2的次方即可 int sum=0; BiTNode *queue[maxSize], *p; int front,rear; int flag=0; // 判斷是否為完全二叉樹 front=rear=0; queue[rear]=T;rear=
(rear+1)%maxSize; while (front!=rear) { p=queue[front];front=(front+1)%maxSize; if (!p) flag=1; //層次遍歷出現了空 else if (flag) return ERROR; //出現了一個非空結點,但前面已經掃描到了空指標,不是完全二叉樹 else { //空指標也入隊 sum++; //計算結點的個數 queue[rear]=p->lchild;rear=(rear+1)%maxSize; queue[rear]=p->rchild;rear=(rear+1)%maxSize; } } // 為完全二叉樹 printf("結點總數為:%d\n", sum); return IsTwoN(sum+1); }