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
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP