c语言 判断二叉树是否为完全二叉树 50C

新手渣渣 请教各位大神 问题出在哪 谢谢
#include 
#include 
#define TRUE  1
#define FALSE 0
#define OK 1
#define ERROR 0

typedef char TElemType;
typedef int Status;
typedef struct BiTNode{
TElemType data2;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

typedef struct QNode
{
BiTree data1;          
struct QNode *next;
}QNode,*QueuePtr;

typedef struct 
{
QueuePtr front;   //队头指针
QueuePtr rear;    //队尾指针 
}LinkQueue;

Status InitQueue(LinkQueue *Q);             //关于队列的函数声明 
Status EnQueue(LinkQueue *Q,BiTree e);
Status DeQueue(LinkQueue *Q,BiTree *e);
Status QueueEmpty(LinkQueue Q);

Status InitBiTree(BiTree *T);               //关于二叉树的函数声明 
Status CreateBiTree(BiTree *T);   //啥意思啊 那个defination 
Status InOrderTraverse(BiTree T);
int Check(BiTree T);

Status InitQueue(LinkQueue *Q)   
{
Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q->front)
exit(OVERFLOW);
Q->front->next=NULL;
return OK; 

Status EnQueue(LinkQueue *Q,BiTree e)   
{
QNode *p;
p=(QueuePtr)malloc(sizeof(QNode));   
if(!p)
exit(OVERFLOW);
p->data1->data2=e->data2;
p->data1->lchild=e->lchild;
p->data1->rchild=e->rchild;
p->next=NULL;
Q->rear->next=p;    
Q->rear=p;         
return OK; 

Status DeQueue(LinkQueue *Q,BiTree *e)   {
if(Q->front==Q->rear)
return ERROR;
QNode *p;
p=Q->front->next;
(*e)->data2=p->data1->data2;
(*e)->lchild=p->data1->lchild;
(*e)->rchild=p->data1->rchild;
Q->front->next=p->next;
if(Q->rear==p)          
Q->rear=Q->front;  
free(p);
return OK;

Status QueueEmpty(LinkQueue Q)   
{
if(Q.front==Q.rear)
return TRUE;
else
return FALSE;

Status InitBiTree(BiTree *T)     
{
*T=NULL;
return OK;
}  

Status CreateBiTree(BiTree *T)     
{
char ch;
scanf("%c",&ch);
if(ch=='*')
{
*T=NULL;
}
else
{
*T=(BiTree)malloc(sizeof(BiTNode));
(*T)->data2=ch;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
return OK;
}

Status InOrderTraverse(BiTree T)   
{
if(T==NULL)
return 0;
else
{
InOrderTraverse(T->lchild);
printf("%c",T->data2);
InOrderTraverse(T->rchild);
}
return OK;
}

int Check(BiTree T)    
{
BiTree S;
LinkQueue Q;
int flag=0;
if(T)
{
InitQueue(&Q);
EnQueue(&Q,T);            
while(!(QueueEmpty(Q)))   
{
DeQueue(&Q,&S);      
if(!S)
{      
flag=1;
}

else 
{
if(flag)
return 0;
else
{
EnQueue(&Q,(S->lchild));
EnQueue(&Q,(S->rchild));
}
}
}
}
printf("\n");
return 1;

}

int main()
{

BiTree T;
int n;
InitBiTree(&T);
CreateBiTree(&T);
printf("\n中序遍历二叉树:");
InOrderTraverse(T);
n=Check(T);
printf("判断是否为完全二叉树 1-是 0-否:%d\n",n);
return 0;
}

16个回答

判断完全二叉树还用这么麻烦嘛。。。。

DeQueue函数 有问题 看下

DeQueue函数有问题,可以参考一下数据结构树的结构那块的教材

DeQueue函数是有问题的

判断一棵树是否是完全二叉树的思路
1>如果树为空,则直接返回错
2>如果树不为空:层序遍历二叉树
2.1>如果一个结点左右孩子都不为空,则pop该节点,将其左右孩子入队列;
2.1>如果遇到一个结点,左孩子为空,右孩子不为空,则该树一定不是完全二叉树;
2.2>如果遇到一个结点,左孩子不为空,右孩子为空;或者左右孩子都为空;则该节点之后的队列中的结点都为叶子节点;该树才是完全二叉树,否则就不是完全二叉树;

根据代码画出来啊,然后看看是不是完全的

共16条数据 首页 2
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐