给定一棵二叉树的先序序列,判断是否是一颗完全二叉树
利用队列 代码:
#include<stdio.h> #include<malloc.h> #include<string.h> //二叉树 typedef struct{ char ch; }T_ElemType;//树中元素 typedef struct BitNode{ T_ElemType data; BitNode *Lchild; BitNode *Rchild; }BitNode,*BiTree; //队列 typedef BiTree Q_ElemType;//队列中元素 typedef struct QDataNode{ Q_ElemType data; struct QDataNode *next; }QDataNode;//链式队列数据节点 typedef struct QHeadNode{ int count; QDataNode *front; QDataNode *rear; }QHeadNode,*LinkQueue; int InitQueue(LinkQueue *Q); int EnQueue(LinkQueue *Q,Q_ElemType elem); int DeQueue(LinkQueue *Q,Q_ElemType *elem); int ClearQueue(LinkQueue *Q); int QueueEmpty(LinkQueue Q); int CreatTree(BiTree *T); void Q_Traverse(BiTree T); int IsFull_BiTree(BiTree T); int main() { BiTree T; CreatTree(&T); if(IsFull_BiTree(T)) printf("Y\n"); else printf("N\n"); } int CreatTree(BiTree *T)//前序创建二叉树 { T_ElemType elem; scanf("%c",&elem.ch); if(elem.ch=='^') { *T=NULL; } else { (*T)=(BiTree)malloc(sizeof(BitNode)); (*T)->data=elem; CreatTree( &( (*T)->Lchild ) ); CreatTree( &( (*T)->Rchild ) ); } } void Q_Traverse(BiTree T)//前序遍历二叉树 { if(T) { printf("%c",T->data.ch); Q_Traverse(T->Lchild); Q_Traverse(T->Rchild); } } int IsFull_BiTree(BiTree T)//判断是否为完全二叉树 { LinkQueue Q; InitQueue(&Q); int flag=0; EnQueue(&Q,T); Q_ElemType p; while(!QueueEmpty(Q)) { DeQueue(&Q,&p); if(!p) { flag=1; } else if(flag) { return 0; } else { EnQueue(&Q,p->Lchild); EnQueue(&Q,p->Rchild); } } return 1; } int InitQueue(LinkQueue *Q)//队列初始化 { (*Q)=(LinkQueue)malloc(sizeof(QHeadNode)); //创建虚拟节点 QDataNode *vhead=(QDataNode *)malloc(sizeof(QDataNode)); vhead->next=NULL; (*Q)->front=vhead; (*Q)->rear=vhead; (*Q)->count=0; return 0; } int EnQueue(LinkQueue *Q,Q_ElemType elem)//入队 { QDataNode *dptr=(QDataNode *)malloc(sizeof(QDataNode)); dptr->data=elem; dptr->next=NULL; (*Q)->rear->next=dptr; (*Q)->rear=dptr; (*Q)->count+=1; return 0; } int DeQueue(LinkQueue *Q,Q_ElemType *elem)//出队 { if(QueueEmpty(*Q)==1) { return -1; } QDataNode *dptr=(*Q)->front->next; *elem=dptr->data; (*Q)->front->next=dptr->next; if(dptr==(*Q)->rear)//如果出队的是最后一个数据 { (*Q)->rear=(*Q)->front;//队列初始化 } free(dptr); (*Q)->count--; } int QueueEmpty(LinkQueue Q)//判断队空 { if( Q == NULL) { return -1; } if( Q->count==0) { return 1; } else { return 0; } }