怎么判断一棵二叉树是否是完全二叉树呢?

2025-01-04 11:05:48
推荐回答(3个)
回答1:

给你讲讲方法吧,实现就自己写了。
完全二叉树(Complete Binary Tree): 若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的节点都连续集中在最左边,这就是完全二叉树。

判断很简单,广度优先搜索整个二叉树,一旦找一个不含有子节点或者只含有一个左子节点之后,那么后续的所有节点都必须是叶子节点。否则,该树就不是完全二叉树。

实现的时候要用到队列。

回答2:

#include
using namespace std;
int a[100],count=0,k=0;
int max(int a,int b)
{
if(a>b) return a;
else return b;
}
struct BiNode
{
char data;
BiNode *lchild, *rchild;
};
class BiTree
{
public :
BiTree(){root=Creat(root);}
~BiTree(){Release(root);}
void PreOrder(){PreOrder(root);}
void Depth(){Depth(root);}
private :
BiNode *root;
BiNode * Creat(BiNode *bt);
void Release(BiNode *bt);
void PreOrder(BiNode *bt);
int Depth(BiNode *bt);
};
int BiTree::Depth(BiNode *bt)
{
int hl,hr;
if(bt==NULL) return 0;
else
{
hl=Depth(bt->lchild );
hr=Depth(bt->rchild );
a[count]=max(hl,hr)+1;
count++;
return max(hl,hr)+1;
}
}
void BiTree::PreOrder (BiNode *bt)
{
if(bt==NULL) return;
else
{
k++;
PreOrder(bt->lchild );
PreOrder(bt->rchild );
}
}
BiNode * BiTree::Creat (BiNode *bt)
{
char ch;
cin>>ch;
if(ch=='#') bt=NULL;
else
{
bt=new BiNode;
bt->data =ch;
bt->lchild=Creat(bt->lchild );
bt->rchild=Creat(bt->rchild );
}
return bt;
}
void BiTree::Release (BiNode *bt)
{
if(bt!=NULL)
{
Release(bt->lchild );
Release(bt->rchild );
delete bt;
}
}
int CF(int a)
{
int b=1;
while(a!=0)
{
a--;
b=b*2;
}
return b-1;
}
int main()
{
BiTree A;
A.Depth ();
A.PreOrder();
for(int i=0;i{
if(a[0]}
if(k==0) cout<<"no"<else
{
if(CF(a[0])==k) cout<<"yes"<else cout<<"no"<}
return 0;
}

回答3: