【数据结构_树_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.
完全二叉树(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; }
相关文章推荐
- 【数据结构_树_Tree_0980】用先序遍历创建树然后层次遍历输出
- 【数据结构_树_Tree_0971】统计利用先序遍历创建的二叉树的深度
- 以二叉链表的方式创建一棵二叉树,并以非递归算法中序输出;计算二叉树的繁茂度,并判断二叉树是否为完全二叉树
- 二叉树的各种实现(创建,叶子结点数,是否为堆,完全二叉树,二叉查找树,交换左右孩子)
- 【c语言】判定2000—2500年中的每一年是否为闰年,并输出结果
- 二叉树的各种实现(创建,叶子结点数,是否为堆,完全二叉树,二叉查找树,交换左右孩子)
- 【数据结构_树_Tree_0983】利用二叉树中序和后序遍历确定二叉树的先序遍历
- 【数据结构_树_Tree_1053】先序创建输出结点的度
- 数据结构:树的BFS,树的层次遍历! 按先序遍历创建一棵树,然后以层次遍历输出。
- 二叉树的各种实现(创建,叶子结点数,是否为堆,完全二叉树,二叉查找树,交换左右孩子)
- 数据结构:题目(3)测试一个数组序列是否是二叉树的前序遍历或者后序遍历结果
- 【数据结构】扩充先序遍历创建二叉树
- 由二叉树中序遍历和先序遍历,构造二叉树,经过镜面翻转后输出层次遍历结果
- 【数据结构_树_Tree_1051】先序创建然后输出指定结点
- 二叉树先序遍历中序遍历结果得出该树,并以后序遍历形式输出
- 数据结构--二叉树的创建、先序遍历、中序遍历、后序遍历、深度、叶子结点数
- 数据库里取出来结果,按照树来排列。 其实就是数据结构中二叉树的先序遍历
- 这是我参考网上编写的一道数据结构关于二叉树求其子树是否指针或者线索,及其对应得值,但是我运行结果却是有点问题,希望高手帮指教下!
- 已知二叉树先序遍历,中序遍历创建二叉树并输出后序遍历
- 基本数据结构:二叉树(binary tree)