首先是关于树的存储结构
树的存储结构一般有三种:
1.双亲表示法(利用下标顺序存储)
2.孩子表示法(利用单链表形成的线性存储结构)
3.孩子兄弟表示法:这种表示方法相比与其他两个更重要,这种方法也叫二叉树表示法,利用二叉链表作为树的存储结构,这种方法让结点由三部分组成:结点值,结点指向第一个孩子的指针和指向下一个兄弟结点的指针(比较方便的实现从树到二叉树的转化)
然后思考我我们如何把树或者森林转化为二叉树呢??
记住一句话“左孩子,右兄弟”意思就是左边的都是孩子,右边的都是结点连成的兄弟
类似的森林与二叉树也是这种规则,先把森林里的每棵树转化为二叉树,再把树根相连接,以第一棵树为轴心顺时针旋转45°即可
然后呢就是关于树、二叉树、森林的遍历的问题,这种好容易出选择题,问你这个森林的序列就是由二叉树的什么遍历出来的序列。他们的等价关系如下所示:
之后就是关于二叉树的应用的问题了,我们涉及到了二叉排序树呀、二叉平衡树和哈夫曼树,重要是心里有幅图,就是关于他们每个树的特征特点。
1.BTS(二叉排序树)
放一个根结点,然后再放入子树,左子树结点值会小于根结点,然后根结点会小于右子树,它的中序遍历是一个升序的序列。BTS的查找的话,就是比如有一棵树,先和根结点比,比他小往左比,比他大往右边继续比一次类推,题目的话可能会出比多少次啊这种题目。查找完肯定会有BTS的插入,它的插入是一个一个插入的,比他小往左插,比他大往右边插,然后关键字相同的话就会插入失败。最后就是BTS的删除,叶结点删掉的话不会破坏二叉树的性质,你在插回去也不会变(平衡二叉树就不一样了,可能会发生改变),如果删除的是结点的话,可以去看他们的后继或者前驱,可以直接替换。
对于二叉树的查找效率的话,主要还是取决于树的高度吧,对于平衡二叉树而言,它的平均查找长度为O(log2n)
然后来到一个很重要的部分:平衡二叉树
平衡二叉树的定义就是任意节点左右子树的高度差不超过1
然后就是很重要的平衡二叉树的插入的环节了,首先我们要了解什么是平衡因子,什么是最小不平衡子树。
平衡因子的话很好理解,就是左子树减去右子树
最小不平衡子树的话就是离插入结点最近的高度差大于1 的子树
对于平衡二叉树的插入的话,有四种形态调整:
RR、LL、LR、RL 这几种选择的方式的话挺好理解的,就是往左往右拧半圈,可以去
https://www.cs.usfca.edu/~galles/visualization/AVLtree.html
自己试试,多练练就知道了,一般出题的话,会出一些比如给你一串数字,然后利用平衡二叉树排序,做题时一定要主要是平衡二叉树还是二叉排序树还是普通的二叉树,不然得搞死len
然后就是平衡二叉树的查找,这里我们要引入一个递推式,就是深度为h,怎么样让平衡二叉树的结点最少呢?其实可以自己试试,前三个分别是 0 2 4,就保证高度差为1就ok了,根据这几个数字,我们得到了一个递推式Nh = Nh-1 + Nh-2 +1。含n个结点的平衡二叉树的最大深度为log2n。
最后就是哈夫曼编码,这个知识点的话,知道一些结论就ok了,
1.对于哈夫曼树而言,构造的哈夫曼树并不唯一,但是其带权路径长度一定相等且都是最优的
2.哈夫曼树的结构比较特殊,它只有度为0和2的结点,可能题目会告诉 你结点求编码符多少个,非叶子结点的个数等等