总览:
- 树的基本概念
- 二叉树
- 树和森林
- 树与二叉树的应用
-
树的基本概念
- 树的定义:若干结点的集合,有唯一根结点,无环,结点个数可为0
-
树的基本术语:
- 结点的度:结点拥有的子树个数或者分支的个数
- 树的度:结点的度的最大值
- 叶子结点:终端结点
- 非终端结点:分支结点
- 树的深度:树中结点的最大层次数
- 结点的深度:从根结点到该结点路径上结点的个数
- 结点的高度:子树的深度
- 有序树与无序树
- 丰满树:理想平衡树,除最底层外其他都是满的
- 森林
-
树的存储结构
- 顺序存储结构
-
链式存储结构
- 孩子存储结构
- 孩子兄弟存储结构
-
二叉树
-
二叉树的定义
- 满二叉树:所有分支结点都有左儿子和右儿子,并且叶子结点都集中在最下一层
- 完全二叉树:除最后一层是满二叉树
-
二叉树的主要性质(教材P123)
- 在二叉树的第i层上之多有2^(i-1)个结点
- 深度为k的二叉树至多有(2^k)– 1个结点
- 对任何一颗二叉树T,如果其终端结点数为N0,度为2的结点数为N2,则N0 = N2 + 1
- 具有n个结点的完全二叉树的深度为[log2n] + 1 (向下取整)
-
如果一颗有n个结点的完全二叉树的结点按层序编号,则对任一结点i(1 <= I <= n),有
- 如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲PARENT(i)是结点[i/2](向下取整)
- 如果2i > n,则结点i无左孩子(结点i为叶子结点);否则其左孩子LCHILD(i)是结点2i
- 如果2i + 1 > n,则结点i无右孩子;否则其右孩子RCHILD(i)是结点2i + 1
-
二叉树的存储结构
- 顺序存储结构:仅适用于完全二叉树,对于一般的二叉树会浪费大量存储空间
- 链式存储结构:最简单的存储结构 (左孩子,数据域,右孩子)
-
二叉树的遍历算法
- 先序遍历
- 中序遍历
- 后序遍历
-
二叉树遍历算法的改进
- 非递归实现:通过栈模拟递归的实现
- 线索二叉树:利用树中的空指针域记录结点的前驱
-
-
树和森林与二叉树的相互转换
- 树 à 二叉树:右兄弟变右儿子
- 二叉树 à 树:右儿子变右兄弟
- 森林 à 二叉树:每棵树先转化为二叉树,然后从后往前将该树变为前一棵树的右儿子,直到变成一棵二叉树
- 二叉树 à 森林:砍右儿子,变成树
-
树和森林的遍历
- 先序遍历
- 后序遍历
-
树与二叉树的应用
- 二叉排序树与二叉平衡树
-
哈夫曼树和哈夫曼编码
-
相关概念:
- 路径:指从树的一个结点到另一个结点的分支所构成的路径。
- 路径长度:指路径上的分支数目。
- 树的路径长度:指从根到每个结点的路径长度之和。
- 带权路径长度:结点具有权值,从该结点到根之间的路径长度乘结点的权值,就是该结点的带权路径长度
- 树的带权路径长度(WPL):树中所有叶子结点的带权路径长度之和
-
构造方法:
- 将这n个权值跟别看成只有根节点的n棵二叉树,这些二叉树构成的集合记为F。
- 从集合F中取出权值最小的两个结点a,b构成一颗新的二叉树c,新二叉树的根节点的权值为其子结点的权值之和。
- 删去a,b,加入新构造的树c
- 重复2,3,直到F中只剩下一棵树位为止,这棵树就是哈夫曼树
-
哈夫曼树的特点:
- 权值越大的结点,距离根节点越近
- 树中没有度为1的结点。
- 树的带权路径长度最短。
-
哈夫曼编码
- 前缀码:任一字符的编码串都不是另一个字符编码串的前缀
- 哈夫曼编码产生最短的前缀码
-
哈夫曼n叉树
- 无法构造时补0
-