資料結構——判斷二叉樹是否為完全二叉樹
阿新 • • 發佈:2019-02-10
該方法採取層次遍歷(回憶層次遍歷的實現需要藉助一個佇列,一邊進隊一邊出隊,在出隊的同時對結點進行visit())
對於完全二叉樹來說,當訪問到空結點時說明該樹已經完結,之後佇列中也將一直為空。
但非完全的二叉樹在空結點之後仍有可能出現數據。
根據這個不同,只需正常層次遍歷,在出隊遇到NULL時,開始檢測後邊的隊伍中是否有非空結點,知道整個佇列結束(front==rear),若出現則說明樹不完全
bool IsComplete(BiTree T){//完全二叉樹返回TRUE,即1 BiTree p;//游標 InitQueue(Q); if(!T) return 1;//若樹為空,也視作完全 EnQueue(Q,T);//把根結點入隊; while(!IsEmpty(Q)){ DeQueue(Q,p); if(p){ EnQueue(Q,p->lchild); EnQueue(Q,p->rchild); }//層次遍歷,上下左右依次入隊 else//進到else則隊中這一空格空了,可能是樹完了,也可能是該空對應的父節點並沒有這個孩子。前者是完全,後者不是,開始驗證 while(!IsEmpty(Q)){ DeQueue(Q,p);//這次出的已經是剛才的後一個元素了 if(p)//一旦之後還存在結點,則說明不完全 return 0; } }//while }