引入头结点可以让所有节点的操作变得一致,否则头结点需要特殊处理.
广义表:
n个表元素组成的有限序列,是线性表的推广.
除了表头元素,剩余的才是标尾.
树与二叉树
结点的度:该结点包含孩子的个数.
树的度:所有结点最高的度.
内部结点:除了根结点和叶子结点之外的.
完全二叉树:最后一层之上的结点都是满的,最后一层的结点是从左到右连续排列的.
前序,中序,后序的区别在于,访问根结点的顺序.
前序:根结点,左子树,右子树
中序:左子树,根结点,右子树
后序:左子树,右子树,根结点
前序:12457836
中序:42785136
后序:48752631
反向构造二叉树
前序+中序,或者中序+后序,都可以把二叉树给还原掉.
树转二叉树:
连线法:
把兄弟结点连起来; 对于有多个孩子的,只保留第一个孩子的连线;最后再把这个树展开.
查找二叉树(排序二叉树)
左孩子<根; 右孩子>根.
最优二叉树(哈夫曼树)
主要用于哈夫曼编码(是一种编码方式,能够让压缩的编码信息变得更短一些;无损压缩).
树的路径长度:把树中所有一段一段的路径给加起来得到的数值.
权:是叶结点中的数值.
带权路径长度:根结点到该叶结点的距离*该叶结点的权
树的带权路径长度:(树的代价):把所有的带权路径长度累计起来.
哈夫曼树要达到的效果是:让树的带权路径长度最短
选出权最小的两个叶结点,然后合成一个小树,然后删除这两个叶结点,重复这个过程得到哈夫曼树.
从下图中可以看出来只使用叶子结点的权,是因为其他结点是构造出来的,一开始并不存在.
线索二叉树
把空的左右指针给利用起来,方便遍历
平衡二叉树
同样的一个序列,它的排序二叉树有可能有多棵.
越平衡,查询效率越高.
调整:将比较靠中间的位置放在根结点附近.