判斷二叉樹是否為完全二叉樹。完全二叉樹的定義是,前n-1層都是滿的,第n層如有空缺,則是缺在右邊,即第n層的最右邊的節(jié)點(diǎn),它的左邊是滿的,右邊是空的。
創(chuàng)新互聯(lián)長期為上千多家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為烏什企業(yè)提供專業(yè)的做網(wǎng)站、成都網(wǎng)站制作,烏什網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
這個問題的描述已經(jīng)提示了解法,采用廣度優(yōu)先遍歷,從根節(jié)點(diǎn)開始,入隊列,如果隊列不為空,循環(huán)。遇到第一個沒有左兒子或者右兒子的節(jié)點(diǎn),設(shè)置標(biāo)志位,如果之后再遇到有左/右兒子的節(jié)點(diǎn),那么這不是一顆完全二叉樹。
這個方法需要遍歷整棵樹,復(fù)雜度為O(N),N為節(jié)點(diǎn)的總數(shù)。
#include#include using namespace std; bool leftMost =false; queue q; bool ProcessChild(Node* node) { if(node) { if(!leftMost) { q.push_back(node); } else return false; } else leftMost=true; return true; } bool IsCompleteBinaryTree(Node* root)//層序遍歷 { if(root==NULL) return true; q.push_back(root); while(!q.empty()) { Node* node=q.pop(); if (!ProcessChild(node->left)) return false; //處理右節(jié)點(diǎn) if (!ProcessChild(node->right)) return false; } return true; }