二叉樹--判斷一棵樹是否是完全二叉樹
阿新 • • 發佈:2019-02-18
完全二叉樹: 前n-1層都是滿的,第n層如有空缺,則是缺在右邊,即第n層的最右邊的節點,它的左邊是滿的,右邊是空的。
如何判斷一個樹是否為完全二叉樹?
思路一:將所有的結點全部押入佇列中,空也壓入,每次判斷佇列的頭如果佇列頭為空了則跳出迴圈,如果此後佇列中還有元素則不是完全二叉樹。
bool IsCompleteTree(BinaryTreeNode *pRoot)
{
if(pRoot == NULL)
return false;
queue<BinaryTreeNode*> q;
q.push(pRoot);
BinaryTreeNode* pCur = q.front();
while (pCur != NULL)
{
q.pop();
q.push(pCur -> left);
q.push(pCur -> right);
pCur = q.front();
}
q.pop();//把空pop出來
//因為以經有一個空了,所以只要頭不為空就不是完全二叉樹
while(! q.empty())
{
if(q.front() != NULL)
return false;
q.pop();
}
return true;
}
思路二:按照層序遍歷二叉樹,找到第一個只有非滿結點(這個節點只有兩種情況,孩子為空或者只有左沒有右),如果之後的節點還有非滿結點,則不是。
bool IsCompleteTree(BinaryTreeNode* pRoot)
{
if(pRoot == NULL)
return false;
queue<BinaryTreeNode*>q;
q.push(pRoot);
//這裡給一個flag是標記是否出現過滿結點
bool flag = false;
while(!q.empty())
{
BinaryTreeNode* pCur = q.front();
q.pop();
//如果已經出現過滿結點,則後面再出現有孩子的結點則一定不是完全二叉樹。
if(flag)
{
if(pCur ->left != NULL || pCur -> right != NULL)
return false;
}
else{
if(pCur -> left != NULL && pCur -> right != NULL)
{
q.push(pCur -> left);
q.push(pCur -> right);
}
else if(pCur -> left == NULL && pCur -> right != NULL)
return false;
else if(pCur -> left != NULL && pCur -> right == NULL)
{
q.push(pCur -> left);
flag = true;
}
else
flag = true;
}
}
return true;
}