【数据结构_树_Tree_0987】输出用先序遍历创建的二叉树是否为完全二叉树的判定结果

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/IronCarrot/article/details/66975379

先说一下什么是完全二叉树:


完全二叉树(Complete Binary Tree)
若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。
完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。
一棵二叉树至多只有最下面的一层上的结点的度数可以小于2,并且最下层上的结点都集中在该层最左边的若干位置上,则此二叉树成为完全二叉树。

//上面资料来源于百度,现在问题来了,怎么判断一棵树是不是完全二叉树?


怎么判断一棵树是否是完全二叉树←链接;


现在,你是不是要问,有简单点的判断方法没有?

有。


       假设N0是度为0的结点总数(即叶子结点数),N1是度为1的结点总数,N2是度为2的结点总数,由二叉树的性质可知:N0=N2+1,
               则N= N0+N1+N2(其中n为完全二叉树的结点总数),由上述公式把N2消去得:N= 2N0+N1-1,由于完全二叉树中度为1的结点数只有两种可能0或1,
               由此得到N0=(N+1)/2或N0=N/2。总结起来,就是 N0=N/2

-//你肯定要问我完全二叉树中度为1的结点数只有两种0或1是什么鬼,OK,看下面;


完全二叉树,可以看做是满二叉树在最后一层从右往左砍掉一些节点。注意,满二叉树的所有节点的度都是2或者0,没有度为1的节点。
如果从满二叉树中在最后一层自左向右砍掉的节点数是偶数,那么该完全二叉树中度为1的节点数就是0。如果砍掉的节点数是奇数,那么该完全二叉树中就有且仅有一个节点的度为1.





#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
typedef struct node
{
	char data;
	struct node *L_Kid,*R_Kid;
}Tree;
int cnt=0,cnt_=0;
void initTree(Tree *&T)
{
	char str;
	cin>>str;
	if(str!='#')
	{
		T=(Tree *)malloc(sizeof(Tree));
		T->data=str;
		cnt++;
		initTree(T->L_Kid);
		initTree(T->R_Kid);
	}
	else
	{
		T=NULL;
		return;
	}
}
int judgeTree(Tree *&T)
{
	if(T!=NULL)
	{
		if(T->L_Kid==NULL && T->R_Kid==NULL)//判断结点度为零
		{
			cnt_++;
		}
		judgeTree(T->L_Kid);
		judgeTree(T->R_Kid);
	}
	return cnt_;
}
int main()
{
	Tree *T;
	initTree(T);
	int m=judgeTree(T);
	if(cnt/2==m || (cnt+1)/2==m)
		cout<<"Y";
	else cout<<"N";
	return 0;
}


阅读更多
换一批

没有更多推荐了,返回首页