您的位置:首页 > 理论基础 > 数据结构算法

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

2017-03-27 19:55 323 查看
先说一下什么是完全二叉树:

完全二叉树(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐