树
术语:
节点的高度:也就是树的高度(从下往上数)
节点的层次(深度):也同数的高度(从上往下数)
节点的度也就是孩子节点 如D的度为3
树的度: 各节点度的最大值
如A树:度为3 (节点B-2 ;C-1;D-3)
总结点:
- 结点数=总度数+1
- 度为m的树,第i层至多有m^i-1个节点
- 高度为h的m叉树至多有个结点
- 高度为h的m叉树至少有h个结点
- 高度为h、度为m的树至少有 h+m-1 个结点
二叉树
结点位置计算:
当前节点 i
左孩子:2i
右孩子:2i+1
父节点:i/2
满二叉树&&完全二叉树
注意两个区分
满二叉树:一颗高度为h,且含有2^h - 1节点的二叉树
特点:1、每一层节点都满的
2、不存在度为1的节点
3、只有最后一层有叶子结点
完全二叉树:
1、最多只有一个度为1的节点
2、只有最后两层可能会有叶子结点
二叉排序树
特点:有序的二叉树。左边小于右边,左边<中间节点<右边
平衡二叉树
特点:左右子树,深度之差不超过1
二叉树遍历
先中后遍历
中序:左根右(左中右)
先序:根左右(中左右)
后序:左右根(左右中)
例如:
中序: D-B-E-A-F-C-G
先序: A-B-D-E-C-F-G
后序: D-E-B-F-G-C-A
层次遍历
就按照一层一层进行遍历,从左–>右
根据遍历序列恢复二叉树
练习
后序:后序–从最后看 根节点,然后再根据中序节点确定根节点的两边节点
中序:
二叉树线索化
特点:也就是将二叉树的叶子结点,的后继,进行分别指向,当前节点的前驱或者是后继。 叶子结点的左孩子指向[前驱],右孩子指向[后继]
rtag = 0 表示有正常右孩子,rtag=1 表示有线索节点(右孩子为后继结点)
todo:代码5.3.2—2
总结点
n = 总结点 nº:度为0的节点;n₁:度为1的节点;n₂… 二叉树最多度为2
-
n= n₁ + 2n₂ +1
-
n0 = n₂+1
-
对于完全二叉树,可以由上面的公式推出如下 n0+n₂ = 一定是奇数,切n₁ 可能是1/0
树
森林:森林是m 颗互不相交的树
树的存储结构
双亲表示法
简略:即也就是数组进行存储,子节点存储这父节点的下标。
孩子表示法
简略:即也就是数组+链表的形式进行存储。
树的转换(重点)
按照一层一层的顺序进行,第一层:A 第二层:B,C…
指针链接 也是从左到右的方式:如某个指针下面只有一个节点了,那么进行放在左节点。
树转二叉树
树转换二叉树
森林转换二叉树
二叉树转换树
二叉树转换深林
树和深林的遍历
运算角度来看:
深林先序 == 二叉树先序
深林中序 == 二叉树后序
树的先序 == 二叉树先序
树的后序 == 二叉树的后序
逻辑角度来看
练习
森林】先序
深林】中序
树的后跟遍历
哈夫曼树(重要)
WPL:带权路径长度
带权路径最小的就是为 哈夫曼树
哈夫曼树不存在度为1的节点、
哈夫曼树的总结点为 2n-1
如何求出WPL
构造哈夫曼树
**构造 哈夫曼树是每次都根据最小的两个值进行构成 **
哈夫曼编码
根据 左0右1的方式,进行构造 当然也可以 左1右0 ,这样可以将 字符进行构成二进制编码。,当然 编码也是不唯一的。
例子: