1. 程式人生 > >二叉樹--判斷一棵樹是否是完全二叉樹

二叉樹--判斷一棵樹是否是完全二叉樹

完全二叉樹: 前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; }