文章目录
一、树的四个性质
1.树中的结点数等于所有结点的度数加1
2.度为m的树中第i层最多的结点个数
(想要第i层结点最多,就说明i的上一层也要最多,当每一层的结点的度都是m时,取到最大值。例如度为2的树,第一层为1,第二层最多为2,第三层为4…)
3.高度为h的m叉树最多有结点个数
首项为1,公比为m,项数为h的等比数列求和
4.具有n个结点的m叉树的最小高度为
n的大小应该大于 前h-1层的结点,小于前h层的最多结点
关于度为m树 和 m叉树的
度为m的树说明至少有个结点的度为m,
但m叉树可以是空树。
二、二叉树的相关
特殊二叉树
满二叉树
高度为h ,含有 结点数为
除叶结点外每个结点的度为2
完全二叉树
从左到右排序,在同一层不可能出现没有左结点而单独出现右结点的存在
第一个为完全二叉树,而第二个并非完全二叉树
二叉排序树
特点:结点的左孩子比他小,结点的右孩子比他大(左小右大)
平衡二叉树
二叉树性质
- n0 = n2 + 1
推导: n = n0 + n1 + n2 = 1 + n1 + 2n2 ----> n0 = n2 + 1 - 第k层最多的结点数是
三、 结点个数问题
1.已知各个度的结点个数,求它的叶结点个数
两个公式
- n = n0 + n1 + n2 +…nm (n 为结点个数,m为最大度数)
- n = 总分支数 + 1 = 1 + 1n1 + 2n2 + 3n3…
经典例题
在一棵度为4的树T中,若有20个度为4的结点,10个度为3的结点,1个度为2的结点,10个度为1的结点,则树T的叶结点个数是:
n = n0 +10 + 1 + 10 + 20 = 1 + 20*4 + 10 *3 + 1 *2 + 10 *1 > n0 = 123 - 41 = 81 个叶结点
关于完全二叉树求它的结点个数
例题类型1:已知总结点个数求叶结点
若一棵完全二叉树有768个结点,则该二叉树中叶结点个数是
思路一:最后一层的结点数 加上 倒数 第二层的叶结点个数(若有)
可以得知前九层的总和为 512 - 1 = 511,
得出最后一层叶结点个数 768 - 511 = 257
但倒数第二层应有 2 的八次 = 256 个结点,若都不是叶结点至少在最后一层产生 256 * 2 = 512 个结点 ,但现在只有 257 ,257 / 2 = 128.5
至少由129 个上一层的结点产生
在上一层总个数 256-129 = 127 得出上一层叶结点个数;
127 + 257 = 384 为总共个数
思路二:由最后一个分支序号 :总结点数除二取下限 768/2 = 384
768 - 384 = 384;
例题类型2:已知叶结点个数求它的总个数
例题:一棵有124个叶子结点的完全二叉树,最多有几个结点
思路一: 公式法 n = 2n0 + n1 - 1 = 2*124 + n1 - 1
n0 = n2 + 1;可以知道完全二叉树的度为1的结点0 or 1 所以 n1 = 1 …>248
例题类型3:通过告知第几层有几个叶子结点来求完全二叉树的最多结点个数
已知一棵完全二叉树的第六层有8个叶结点,则该完全二叉树的结点个数最多是
思路:可能会陷入第六层就是最后一层的误区,这8个叶结点可以是靠右的
8个结点,所以他的前24个结点会产生下一层的48个结点再加上前六层即可得到答案。
63 + 48 = 111
四、二叉树的几个遍历
前序(根左右)
中序(左根右)
后序(左右根)
两个遍历确定一棵树(但必须要有中序序列)
层次遍历
几种特别的
先序序列与中序序列相同
只有右子树
先序序列与后续序列相反
高度等于结点数
先序序列与后续序列相同
只有一个根结点
线索二叉树相关
tag = 0 表示孩子, = 1表示指向前驱 or 后继
几种需要三叉链表才能求的
先序线索二叉树中求先序前驱
后续线索二叉树中求后序后继
树、森林、二叉树相互转换
- 孩子兄弟表示法记住左孩子右兄弟即可。
- 树转化成二叉树根结点度只为1
- 将森林转化为二叉树时,叶结点的个数等于二叉树中左孩子指针为空的结点个数(左指针代表孩子,左指针为空代表没有孩子结点)
- 树的后根遍历与对应的二叉树的中根遍历相同
哈夫曼树、哈夫曼编码
带权路径长度最小的二叉树叫做哈夫曼树
哈夫曼树的构造
权值最小的两个结点合成一个结点 依次向上
几个特点
如果告诉哈夫曼树有n个叶子结点,可以得到它的非叶子结点总数是n - 1
度为m 的哈夫曼树,叶子结点个数为n ,则非叶子结点个数:
(n - 1 ) / m - 1 取上限
哈夫曼编码的几个知识
- 关于前缀码:即前缀不能相同,例:01,011即不是前缀码,01相同
- 根至路径的序列,0表示转向左孩子,1表示转向右孩子