数据结构第6章 树(下)
§6.4 树和森林
6.4.1 树的储存结构@H_301_6@
①父亲表示法(利用每个(除根)结点只有唯一的父亲的性质)
②孩子表示法(用广义表实现)
③孩子兄弟表示法(二叉链表指向第一个孩子结点和下一个兄弟结点)
6.4.2森林与二叉树的转换@H_301_6@
二叉树和树都可以用二叉链作为储存结构(分别是孩子表示法和孩子兄弟表示法),给定一棵树,可以找到唯一的一棵二叉树与之对应。两者的物理结构是相同的,只是解释不同而已(旋转)。
任何一棵和树对应的二叉树,其右子树必空(因为根是没有兄弟的),在森林中可以利用这一性质把第二棵树的根结点看做第一棵树的根结点的兄弟
至此,森林或树与二叉树可以相互转换。
①森林转换成二叉树
如果F={T1,T2,…,Tm}是森林,则可以按如下的规则转换成一棵二叉树B=(root,LB,RB)。
⑴若F为空,即m=0,则B为空树。
⑵若F非空,即m!=0,则B的根root即为森林中第一棵树的根ROOT(T1);B的左子树LB是从T1中根结点的子树森林F1={T11,T12,T1m1}转换而成的二叉树;其右子树RB是从森林F’={T2,T3…Tm}转换而成的二叉树
②二叉树转换成森林
如果B=(root,RB)是一棵二叉树,则可按如下规则转换成森林F={T1,..,Tm}
⑴若B为空,则F为空。
⑵若B非空,则F中第一棵树T1的根ROOT(T1)即为二叉树B的根root;T1中的根结点的子树森林F1是由B的左子树LB转换而成的森林;F中除T1之外的其余树组成的森林F’={T2,T3…,Tm}是由B的右子树RB转换而成的森林。
6.4.3 树和森林的遍历@H_301_6@
当以二叉链表作为树的储存结构时,树(或森林)的先序遍历和后序遍历可以借用二叉树的先序遍历和中序遍历算法实现。
§6.5 树与等价问题
(就是并查集,不废话了)
§6.6 Huffman树及其应用
6.6.1 最优二叉树(Huffman树)@H_301_6@
从树上一个结点到另一个结点之间的分支构成两个结点之间的路程,路径上的分支数目称作路径长度,树的路径长度是从树根到每一个结点的路径长度之和。
结点的带权路径长度为从该结点到树根之间的路径长度与结点上权的乘积。树的带权路径长度为树中所有叶子结点的带权路径长度之和。
树的带权路径长度记作
WPL(Weighted Path Length of Tree) = (w1l1+w2l2+……+wnln)
WPL最小的二叉树就是最优二叉树(Huffman树)
Huffman树的构造方法:贪心法,每一步都取最小的两个结点合并。
Huffman树的特点:
①没有度为1的点(n1=0)(这类树又称作严格的(或正则的)二叉树)
②有n个叶子结点的Huffman树共有 (2n-1) 个结点
③Huffman树实际上是无序的
6.6.2 Huffman编码@H_301_6@
要设计长短不等的编码,则必须任一字符的编码都不是另一个字符编码的前缀(前缀编码)。
可以利用Huffman树来构造WPL最小的二叉树来实现Huffman编码(前提是编码都用01表示)
如图
§6.7 回溯法与树的遍历
DFS思想 递归思想 回溯思想
§6.8树的计数
结论:含有n个结点的不相似的二叉树有 C(n,2n)/(n+1) 棵