update a brief conclusion on thu_dsa/chp5/chp5.md
This commit is contained in:
@@ -1,6 +1,20 @@
|
||||
Conclusion on Chapter Five: Binary Tree
|
||||
=======================================
|
||||
|
||||
## 知识脉络
|
||||
|
||||
本章讨论树与二叉树。树是一种层次结构,在现实生活中很多事物都具有分层结构,因此树在现实世界中具有大量的应用。为了把握树的结构,需要将它与线性结构以及图联系起来考虑,比如树是半线性结构,是连通无环图。
|
||||
|
||||
二叉树是树的一种特例,但是它却足以表示所有类型的树。这样,利用二叉树来作为算法的底层结构,不仅不失一般性,而且得益于二叉树结构的简洁性,问题的描述与实现反而可得到简化。
|
||||
|
||||
二叉树应用的关键在于遍历算法,按照根节点访问次序的不同,遍历可以分为先序遍历,中序遍历与后序遍历。对于这三种遍历算法,应该重点去把握它们的非递归形式。把握非递归形式遍历算法的关键,在于掌握每种遍历中各个节点实际的访问次序,比如第一个访问的节点,还有每个节点的直接后继等,借助图形有助于理解各种遍历的特点;此外还需要掌握算法的不变性,比如对于后序遍历而言,每个出栈的节点接受访问后,以该节点为根的子树就访问完毕,此后应该访问的节点是它的右兄弟(如果存在的话)或者父节点。借助这三种遍历中的某几个,可以重新构造一棵二叉树。此外,还有一种层次遍历,此时应该考察用到的辅助队列的规模的变化情况。
|
||||
|
||||
表达式树是二叉树的一个实例(只考虑双目运算符),对表达式树进行遍历可以得到不同形式的表达式,先序遍历得到前缀表达式(prefix),中序遍历得到中缀表达式(inorder),后序遍历得到后缀表达式(postfix or Reverse Polish Notation, RPN)。利用表达式树可以揭示一些规律,比如对表达式树的计算应该首先计算左子树,然后计算右子树,再将两者作用于根节点的运算符,这个过程恰好对应了二叉树的后序遍历,因此后缀表达式是易于计算的。
|
||||
|
||||
编码树是二叉树的另一个实例。一棵合法的编码树必须是前缀无歧义(prefix free coding, PFC)的。构造一棵编码树可以自底向上,依次将原字符集的各个子集的编码树合并,从森林中构造出编码树。为了提高编码效率,提出了叶节点平均深度(average leaf depth, ald)的概念,`ald`最小的编码树即为最优编码树,最优编码树具有`双子性`和`层次性`两个特性。可以证明,完全二叉树对应了一棵最优编码树,因此对于大小为`n`的字符集,可以直接构造一棵规模为`2n - 1`的完全二叉树来作为编码树。
|
||||
|
||||
在实际应用过程中,字符集中的各个字符出现的频率并非是完全相等的,在一般情况下往往具有很大的差别,此时最优编码树并非“最优”的编码策略。一种思路是出现频率高的字符编码长度更短,频率低的字符编码长度可以更长,这就是`Huffman树`的思路。`Huffman树`提出了基于权重的叶节点深度,即叶节点加权平均深度(weighed average left depth, wald),此时的最优编码树应该满足`wald`最小。为了理解`Huffman树`的构造过程,关键在于把握`Huffman树`的结构性与层次性,以及字符集`T`与`T'`对应的编码树之间的关系,这样只要将权重最小的两个字符构造成一个`超字符`,问题的规模就可以减小1,重复这个过程就可以完成`Huffman树`的构造。
|
||||
|
||||
## 树形结构
|
||||
|
||||
> 什么是树形结构?
|
||||
|
||||
Reference in New Issue
Block a user