[樹] 6.49 判斷完全二叉樹、滿二叉樹 - C語言
阿新 • • 發佈:2018-11-26
題目來源:嚴蔚敏《資料結構》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);
}