/*
假设二叉树采用二叉链存储结构,设计一个算法判断一颗二叉树是否为完全二叉树。
*/
#include <iostream>
#include <malloc.h>
#define MaxSize 100
typedef char ElemType;
using namespace std;
typedef struct node
{
ElemType data;
struct node *lchild;
struct node *rchild;
} BTNode;
void CreateBTNode(BTNode *&b,char *str) //创建二叉树
{
BTNode *St[MaxSize],*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];
}
}
/*
完全二叉树应满足:
(1)某节点没有左孩子,则一定没有右孩子;
(2)若某节点缺左或右孩子,则其所有后继节点一定无孩子。
*/
bool isT(BTNode *b)
{
BTNode *qu[MaxSize],*p; //定义队列,用于分层判断
int front=-1,rear=-1;
bool cm=true; //表示二叉树是否为完全二叉树
bool bj=true; //表示到目前为止所有节点均有左右孩子
if(b!=NULL)
{
rear++;
qu[rear]=b;
while(front!=rear)
{
front=(front+1)%MaxSize;
p=qu[front];
if(p->lchild==NULL) //*p没有左孩子
{
bj=false;
if(p->rchild!=NULL) //没有左孩子的情况下,有右孩子,错误
cm=false;
}
else //*p有左孩子
{
if(bj) //所有节点都有左右孩子
{
rear=(rear+1)%MaxSize;
qu[rear]=p->lchild;
if(p->rchild==NULL) //有左孩子,但没有右孩子
bj=false;
else //有左孩子,也有右孩子
{
rear=(rear+1)%MaxSize;
qu[rear]=p->rchild;
}
}
else //到目前为止已有节点缺少左或右孩子
cm=false;
}
}
return cm;
}
return true;
}
int main()
{
BTNode *b;
CreateBTNode(b,"A(B(D,E),C(F,))");
cout<<"A(B(D,E),C(F,))是否为完全二叉树:";
if(isT(b))
cout<<"是"<<endl;
else
cout<<"否"<<endl;
CreateBTNode(b,"A(B(D(,G)),C(E,F))");
cout<<"A(B(D(,G)),C(E,F))是否为完全二叉树:";
if(isT(b))
cout<<"是"<<endl;
else
cout<<"否"<<endl;
cout<<endl;
return 0;
}
运行结果: