判断是否为完全二叉树

原创 2018年04月15日 20:50:01

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

利用队列  代码:

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



判断一颗二叉树是否是完全二叉树

我们知道,假如一棵二叉树的高度是h,对于一棵完全二叉树,它的前h-1行一定是满的,第h行可以满也可以不满,但是结点必须集中于最后一行的左边,如果满则是满二叉树,不满的就是完全二叉树。 那么那...
  • qq_33417547
  • qq_33417547
  • 2016-12-01 17:06:51
  • 1652

【数据结构】判断一棵树是否为完全二叉树

【数据结构】判断一棵树是否为完全二叉树
  • LX18792732127
  • LX18792732127
  • 2017-07-29 15:35:17
  • 904

设计一个算法,判断一个二叉树是否为完全二叉树

思想:根据完全二叉树的定义,对完全二叉树按照从上到下、从左到右的层次遍历,应该满足一下两条要求: ●某节点没有左孩子,则一定无右孩子 ●若某节点缺左或右孩子,则其所有后继一定无孩子 若不...
  • wuruiaoxue
  • wuruiaoxue
  • 2015-07-08 01:26:23
  • 9836

判断一棵二叉树是否为完全二叉树

代码如下: package treeInfo; import java.util.LinkedList; class Node{ public Node left; public Node r...
  • zcsky027
  • zcsky027
  • 2014-10-28 21:08:19
  • 2384

如何判断一棵二叉树是否是完全二叉树

初次学习二叉树这种数据结构的时候,我们知道,假如一棵二叉树的高度是h,对于一棵完全二叉树,它的前h-1行一定是满的,第h行可以满也可以不满(结点必须集中于最后一行的左边),如果满则是满二叉树,不满的就...
  • peiyao456
  • peiyao456
  • 2016-11-13 21:00:42
  • 4086

完全二叉树判断 层次遍历

有一棵二叉树,请设计一个算法判断它是否是完全二叉树。 给定二叉树的根结点root,请返回一个bool值代表它是否为完全二叉树。树的结点个数小于等于500。 /* struct TreeNo...
  • zwy1258432405
  • zwy1258432405
  • 2017-08-31 21:52:38
  • 200

编写一个判断二叉树是否为完全二叉树的C语言函数

Q :编写一个判断二叉树是否为完全二叉树的C语言函数主要解答者:born_in70s提交人:langhaixin感谢:born_in70s审核者:starfish社区对应贴子:查看     A : 二...
  • wdcszl
  • wdcszl
  • 2005-05-08 21:10:00
  • 4778

二叉树--判断一棵树是否是完全二叉树

完全二叉树: 前n-1层都是满的,第n层如有空缺,则是缺在右边,即第n层的最右边的节点,它的左边是满的,右边是空的。如何判断一个树是否为完全二叉树? 思路一:将所有的结点全部押入队列中,空也压入,每...
  • sayhello_world
  • sayhello_world
  • 2017-07-27 19:16:05
  • 489

数据结构面试题/判断一棵树是否是完全二叉树

二叉树: 1.满二叉树:在一棵二叉树中,如果所有分支节点都存在左子树和右子树,并且所有叶子节点都在同一层上。 2.完全二叉树:如果一棵具有N个结点的二叉树的结构与满二叉树的前N个结点的结构相同,称...
  • s25691011
  • s25691011
  • 2017-07-29 20:09:52
  • 1033

C++算法之 判断是否为完全二叉树

判断完全二叉树: 完全二叉树,除最后一层外,每一层上的节点树都达到了最大值;在最后一层上只缺少右边的若干节点! 算法思路: 按层次(从上到下,从左到右)遍历二叉树,当遇到一个节点的左子树为空时,...
  • djb100316878
  • djb100316878
  • 2015-01-12 11:36:41
  • 5006
收藏助手
不良信息举报
您举报文章:判断是否为完全二叉树
举报原因:
原因补充:

(最多只允许输入30个字)