題目來源:嚴蔚敏《數據結構》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;
}