判断是否为完全二叉树

给定一棵二叉树的先序序列,判断是否是一颗完全二叉树

利用队列  代码:

#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;
	}
}



猜你喜欢

转载自blog.csdn.net/holly_z_p_f/article/details/79953024