判断一棵二叉树是不是完全二叉树
一棵完全二叉树,除最后一层外,是一棵满二叉树,最后一层可以不满,但是必须从左往右连续的有。
完全二叉树的不对称性决定了判断是不是一棵二叉树是不是完全二叉树最好要用非递归算法。
在一般的广度优先遍历中,出队一个结点后检查这个结点是否有左右孩子,有的话相应孩子进队。
这道题中,无论有没有左右孩子都进队,得到第一个NULL结点时判断队列里有没有非空结点,有的话它就不是一棵完全二叉树。
代码如下:
#include<iostream>
#include<queue>
using namespace std;
typedef struct node{
char val;
struct node* left;
struct node* right;
}TreeNode,*Tree;
//判断完全二叉树
bool levelOrder(Tree& t) {
if(t == NULL) return 0;
queue<TreeNode*> q;
q.push(t);
while(!q.empty()){
TreeNode* s = q.front();
q.pop();
if(s != NULL){ //s非空,把s的左右孩子都入队
q.push(s->left);
q.push(s->right);
}
else //s为空,检测队中是否有非空结点
while(!q.empty()){
s = q.front();
q.pop();
if(s != NULL) return false; //如果有,则不是完全二叉树
}
}
return true;
}
void CreateTree(Tree& t){
char x;
cin>>x;
if(x == '#') t = NULL;
else{
t = new TreeNode;
t->val = x;
CreateTree(t->left);
CreateTree(t->right);
}
}
int main(){
Tree t;
CreateTree(t);
/*
a b d # # e # # c f # # #
*/
/*
a b d # # e # # c # g # #
*/
cout<<"levelOrder:"<<endl;
cout<<levelOrder(t);
}
运行结果: