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
廣告