对一个节点而言有四种可能:
1. 当前节点有两个孩子
2.当前节点有左孩子 没有右孩子
3,当前节点 没有左孩子 有 右孩子
4,当前节点 没有孩子
我们层次遍历每一个节点,若碰到3的情况 一定不是完全二叉树 ,直接返回,
当我们 第一次碰到: 2 或者 4 的情况的时候, 这意味着 我们之后遍历的节点都必须是叶子,否则不是完全二叉树。
若程序能执行到结束, 返回 true;
//判断是否为完全二叉树
bool isCBT(TreeNode* head){
if(head == nullptr)
return true;
queue<TreeNode*> queue;
TreeNode* l;
TreeNode* r;
TreeNode* help;
//是否开始叶子判断
bool left = false;
queue.push(head);
while(!queue.empty()){
help = queue.front();
queue.pop();
l = help->left;
r = help->right;
if(l == nullptr && r != nullptr){
return false;
}
if( left && (l != nullptr || r != nullptr)){
return false;
}
if( l != nullptr){
queue.push(l);
}
if( r != nullptr){
queue.push(r);
}
//判断什么时候该边叶子状态
//第一次碰到 两个孩子都为空 或者 左不空 右空
if(l == nullptr || r == nullptr){
left = true;
}
}
return true;
}
全部代码:
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
struct TreeNode{
int value;
TreeNode* left;
TreeNode* right;
};
//判断是否为完全二叉树
bool isCBT(TreeNode* head){
if(head == nullptr)
return true;
queue<TreeNode*> queue;
TreeNode* l;
TreeNode* r;
TreeNode* help;
//是否开始叶子判断
bool left = false;
queue.push(head);
while(!queue.empty()){
help = queue.front();
queue.pop();
l = help->left;
r = help->right;
if(l == nullptr && r != nullptr){
return false;
}
if( left && (l != nullptr || r != nullptr)){
return false;
}
if( l != nullptr){
queue.push(l);
}
if( r != nullptr){
queue.push(r);
}
//判断什么时候该边叶子状态
//第一次碰到 两个孩子都为空 或者 左不空 右空
if(l == nullptr || r == nullptr){
left = true;
}
}
return true;
}
string getTreeWithSerial(TreeNode* head){
if(head == nullptr){
return "#_";
}
char c[8];
sprintf(c,"%d",head->value);
string s = c;
s = s+ '_';
string s1 = getTreeWithSerial(head->left);
string s2 = getTreeWithSerial(head->right);
return s + s1 + s2;
}
TreeNode* getTree(int arr[],int length,int i){
if(i < length){
TreeNode* Treenode = new TreeNode();
Treenode->value = arr[i];
if((2*i+1) < length){
Treenode->left = getTree(arr, length, 2*i+1);
}else{
Treenode->left = nullptr;
}
if((2*i+2)<length){
Treenode->right = getTree(arr, length,2*i+2);
}else{
Treenode->right = nullptr;
}
return Treenode;
}
return nullptr;
}
int main(){
int arr[] = {5,3,8,2,4,6,9,1};
// int arr[] = {1,2,3};
int length = sizeof(arr)/sizeof(arr[0]);
//建树
TreeNode* head = getTree(arr, length,0);
//前序查看建树是否正确
string str = getTreeWithSerial(head);
//查看是否是平衡二叉树
cout << isCBT(head)<<endl;
cout <<str;
// cout << head->right->value;
return 0;
}