
这个是分别左右空指针域的个数推断不出来吧,加起来还可以,原因如下:
设二叉树中度为0的结点个数为n0,度为1的结点个数为n1,度为2的结点个数为n2
按照条件n0 = m,于是n2 = m -1,n1= n - n2 = n - m + 1
虽然叶子结点可以保证左右指针域为空,但是度为1的分支呢?到底是左孩子还是右孩子没有办法知道
总的倒是很清楚:n1 + 2n0 = n + m + 1,实际上就是结点个数加1
你还是看看实例吧:
如m= 1, n = 1,则一个叶子一个分支的二叉树形态就有两种
A
/
B
A
\
B
前一种情况下左边一个空,右边两个空
后一种情况下左边两个空,右边一个空
至于更多的结点,二叉树的形态就更多了
当然,如果前面加上限制为没有度为1 的分支,这也就是所谓的正规或者正则二叉树,只有度为0的叶子和度为2的分支,此时倒是可以马上得出结论:
左右指针域为空的都是m个或者n+1个
双向链表和二叉树链表区别为:指针不同、指向不同、访问不同。双向链表和二叉树链表都能从链表中的任何一个结点出发能找到任何其他结点。都用来存放线性表中的数据元素。
一、指针不同
1、双向链表:双向链表的每个数据结点中包含一个元素和两个指针。
2、二叉树链表:二叉树链表的每个数据结点中包含一个元素和只有一个指针。
二、方向访问不同
1、双向链表:双向链表是双向链表,分别指向直接后继和直接前驱。
2、二叉树链表:二叉树链表是单向链表,指向直接前驱。
三、访问不同
1、双向链表:双向链表除了首尾节点,其他节点都能访问他的前节点和后节点。
2、二叉树链表:二叉树链表的每个节点只能访问他的左右孩子节点,不能向上访问他的父节点。
对于一般的家谱树(一般的多叉树)来说,我们可以很清楚的看出层次关系,树的层数表示代数(一共多少代人),树的最后一层表示最后一代人,由于多叉链表法表示的不方便,因此被迫无奈采用孩子兄弟表示法(二叉链表法).
假设我的家谱是这样的:
转换成孩子兄弟表示法后是这样的:
我们要做的是:这时我们要找有多少代人,以及最后以一代人出来。
如果根据第一个图来说找代数就是树的高度,最后一代人就是树的最后一层,二叉链表法中却不如第一个图来的直观,但是只要把握二叉链表法的本质还是很清晰的,根据孩子兄弟表示法的特性,(看二叉链表法的图)结点3的左子树保存的是其孩子,结点3的右子树保存的是其堂兄弟(对照第一个图来看)。假设我们每一个节点都有一个变量用来存储它是第几代的,那么从结点1开始,我们要找结点10是第几代的话,应该这么做:结点1是第一代,然后经过结点5是第二袋,然后看到结点10是第三代。因为第i个结点的左子树是他的孩子,既然是孩子,代数必须+1,而右子树是和第i结点同辈份的(堂兄弟),因此不能加1。本质来说就是往左走代数+1,向右走代数不变。这就是这题目的思路,通过这个方法你就可以知道有多少代人了,且每个节点都有保存了代数信息(用变量存起来了),再次遍历树把最后一代的结点输出即可。清晰了吗?清晰了我就开始写程序。