您的位置:首页 > 理论基础 > 数据结构算法

数据结构—判断是否为完全二叉树

2016-05-29 14:27 417 查看
/*
假设二叉树采用二叉链存储结构,设计一个算法判断一颗二叉树是否为完全二叉树。
*/
#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;
}


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构