C++中檢查二叉樹的完整性


假設我們有一個二叉樹。我們必須檢查這棵樹是否是完整的二叉樹。n級的完整二叉樹具有n-1個完整的級別,並且n級的所有節點都從左側填充。所以如果輸入樹是這樣的:


那麼輸出將為真,因為這是一個完整的二叉樹。

為了解決這個問題,我們將遵循以下步驟:

  • 如果樹為空,則返回null

  • 建立一個佇列q並將根節點插入其中

  • 設定flag := true

  • 當q中有一些元素時

    • sz := 佇列的大小

    • 當sz不為0時

      • node := 從佇列中刪除後的節點

      • 如果節點有左子樹,則

        • 如果flag已設定,則將節點的左子樹插入q中,否則返回false

      • 否則flag := false

      • 如果節點有右子樹,則

        • 如果flag已設定,則將節點的右子樹插入q中,否則返回false

      • flag := false

      • sz := sz – 1

  • 返回true

讓我們看看下面的實現以更好地理解:

示例

 線上演示

#include <bits/stdc++.h>
using namespace std;
class TreeNode{
   public:
   int val;
   TreeNode *left, *right;
   TreeNode(int data){
      val = data;
      left = NULL;
      right = NULL;
   }
};
void insert(TreeNode **root, int val){
   queue<TreeNode*> q;
   q.push(*root);
   while(q.size()){
      TreeNode *temp = q.front();
      q.pop();
      if(!temp->left){
         if(val != NULL)
            temp->left = new TreeNode(val);
         else
            temp->left = new TreeNode(0);
         return;
      }else{
         q.push(temp->left);
      }
      if(!temp->right){
         if(val != NULL)
            temp->right = new TreeNode(val);
         else
            temp->right = new TreeNode(0);
         return;
      }else{
         q.push(temp->right);
      }
   }
}
TreeNode *make_tree(vector<int> v){
   TreeNode *root = new TreeNode(v[0]);
   for(int i = 1; i<v.size(); i++){
      insert(&root, v[i]);
   }
   return root;
}
class Solution {
   public:
   bool isCompleteTree(TreeNode* root) {
      if(!root)return true;
      queue <TreeNode*> q;
      q.push(root);
      bool isComplete = true;
      while(!q.empty()){
         int sz = q.size();
         while(sz--){
            TreeNode* node = q.front();
            q.pop();
            if(node->left){
               if(isComplete){
                  q.push(node->left);
               }else return false;
            }else{
               isComplete = false;
            }
            if(node->right){
               if(isComplete){
                  q.push(node->right);
               }else return false;
            }else{
               isComplete = false;
            }
         }  
      }
      return true;
   }
};
main(){
   vector<int> v = {1,2,3,4,5,6};
   TreeNode *r1 = make_tree(v);
   Solution ob;
   cout << (ob.isCompleteTree(r1));
}

輸入

{1,2,3,4,5,6}

輸出

1

更新於:2020年5月2日

172 次瀏覽

開啟您的職業生涯

完成課程後獲得認證

開始學習
廣告