判断是否为完全二叉树的关键也是找到不饱和节点。
思路:
由于完全二叉树在每一层非空节点都是一个接一个连续分布的,不可能出现两个非空节点之间交叉一个空节点。
通过层序遍历从上往下,从左往右将每一个节点(包括非空节点)都放到队列里
在出队列的过程中,如果遇到空节点,则跳出循环
跳出循环后,然后再判断队列中剩下的元素是否有非空节点:
有非空节点:非完全二叉树;
没有非空节点(全是空节点):完全二叉树。
#include<iostream>
#include<stdlib.h>
#include<bits/stdc++.h>
#include<queue>
#define ElemType int
using namespace std;
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
}TNode,*Tree;
//int treenum[]={1,2,4,0,0,5,0,0,3,0,0};
int treenum[]={1,2,0,5,0,0,3,0,0};
int k;
void createTree(Tree &T,int &k)
{
ElemType n;
// printf("输入为0停止!\n");
// scanf("%d",&n);
if(treenum[k]==0){
T=NULL;
k++;
}
else{
T=new TNode;
T->data=treenum[k];
k++;
// cout<<"T="<<T->data<<"k="<<k<<endl;
createTree(T->lchild,k);
createTree(T->rchild,k);
}
}
//先序遍历
int PreTree(Tree &T)
{
if(T==NULL){
return 0;
}
else{
cout<<T->data;
PreTree(T->lchild);
PreTree(T->rchild);
}
}
//判断完全二叉树
bool isCompleteTree(Tree T){
if(T==NULL){
return false;
}
queue<Tree>Q;
Tree cur,temp;
Q.push(T);
while(Q.size()!=0){
cur=Q.front();
Q.pop();
if(cur==NULL){
break;
}
else{
Q.push(cur->lchild); //将cur的左孩子加入队列,层序遍历
Q.push(cur->rchild); //将cur的右孩子加入队列,层序遍历
}
}
while(Q.size()!=0)
{
cur=Q.front();
if(cur){
return false;
}
}
return true;
}
int main()
{
Tree T;
k=0;
createTree(T,k);
cout<<isCompleteTree(T)<<endl;
return 0;
}