#include<iostream>
using namespace std;
#define max 100
typedef char elemtype;
typedef struct node
{
elemtype data;
struct node*lchild;
struct node*rchild;
}BTnode;
void create(BTnode*&b,char *str)//创建二叉树
{
BTnode *st[max],*p;
int top=-1,k,j=0;
char ch;
b=NULL;
ch=str[j];
while(ch!='\0')
{
switch(ch)
{
case'(':
top++;
st[top]=p;
k=1;
break;
case')':
top--;
break;
case',':
k=2;
break;
default:
p=(BTnode*)malloc(sizeof(BTnode));
p->data=ch;
p->lchild=p->rchild=NULL;
if(b==NULL)
b=p;
else
{
switch(k)
{
case 1:st[top]->lchild=p;
break;
case 2:st[top]->rchild=p;
break;
}
}
}
j++;
ch=str[j];
}
}
void display(BTnode*b)//输出二叉树
{
if(b!=NULL)
{
cout<<b->data;
if(b->lchild!=NULL||b->rchild!=NULL)
{
cout<<"(";
display(b->lchild);
if(b->rchild!=NULL)
cout<<",";
display(b->rchild);
cout<<")";
}
}
}
int CompBTnode(BTnode*b)
{
BTnode *Qu[max],*p;
int front=0,rear=0;
int a=1;//表示二叉树为完全二叉树
int c=1;//表示到目前为止所有结点均有左右孩子
if(b!=NULL)
{
rear++;
Qu[rear]=b;
while(front!=rear)
{
front++;
p=Qu[front];
if(p->lchild==NULL)//*p结点没有左孩子
{
c=0;
if(p->rchild!=NULL)//没有左孩子有右孩子
a=0;
}
else
{
if(c==1)
{
rear++;
Qu[rear]=p->lchild;
if(p->rchild==NULL)//*p有左孩子但是没有右孩子
c=0;
else//*p有右孩子,继续判断
{
rear++;
Qu[rear]=p->rchild;
}
}
else
a=0;
}
}
return a;
}
return 1;//空树
}
int main()
{
BTnode*b;
create(b,"A(B(D,),C)");
cout<<"二叉树为:";
display(b);
cout<<endl;
if(CompBTnode(b))
cout<<"是完全二叉树"<<endl;
else
cout<<"不是完全二叉树"<<endl;
return 0;
}
数据结构--完全二叉树的判断
最新推荐文章于 2022-10-05 16:56:51 发布