本节继续总结二叉树的变种,上节里的哈夫曼树是一种独特的二叉树,用于编解码会比较有效。这里的两种树都是BST二叉搜索树的加强版。
》BST二叉搜索树的弱点
我们之前也提到了,当插入序列是有序的时候,二叉搜索树几乎一边倒,像一个链表,这样查找的效率是低下的,接近O(N)。为了改善这一点,后来人考虑到算法效率低是因为它一边倒,太不平衡了,让它更平衡一点左右对称,查找的时候类似折半,就可以接近O(logN)了。
》AVL自平衡二叉树
1) 一句话:首先它是个二叉搜索树,其次它的任何节点的两个子树的高度差别都<=1
2)它是如何做到的?
首先,它的基础操作跟二叉搜索树一致。然而在插入或者删除节点的时候有可能破坏它的平衡性(左右高度差<=1的原则),所以在插入和删除的时候,对二叉搜索树进行调整让它再次平衡。
旁白:所以我们在编码AVL时的思路也是这样,在插入和删除的时候进行调整。那么萌新三连来了,如何判断是否平衡?不平衡的时候怎么调整?如果分情况讨论情况是不是特别复杂?
回答:就是特别复杂。但是好在大家都已经研究透了,我们不用自己去填这个坑了。这里有一篇非常详细的文章,详细到我这一节感觉可以直接结束了。不造轮子了,请看https://www.cnblogs.com/skywang12345/p/3577479.html
3)总结:AVL的特点
3.1)Node节点里面新增height。这个高度代表自身高度,方便我们在插入或者删除节点后对节点进行检测是否平衡。
3.2)插入或删除后不平衡需要进行情况分析:
a.插入或者删除后偏向左子树L的左子树L,进行LL旋转
依次类推,LR,RR,RL
3.3)其中LL,RR只需要旋转一次,LR先要RR再LL旋转,RL先要LL再RR旋转。
》RB红黑树
1) 一句话:首先它是个二叉搜索树,其次它跟AVL一样,是另一种实现平衡二叉树的方式。只不过的它的规则看似更加复杂。
2)一样,看大佬的文章http://blog.csdn.net/chenhuajie123/article/details/11951777。(话说网上有些文章写的可能不对,要注意辨别,不然看个一知半解的)。
3)提个问题,AVL是最早出现的平衡二叉树算法,为啥后面还要出现红黑树?
只能说算法就是一直推陈出新的,红黑树是一种比AVL更优化的算法。这里有些说法还是比较能理解的http://blog.csdn.net/mmshixing/article/details/51692892
这篇暂时写到这里,没有这么强的功力和充足的时间,先过一下原理的东西,明白它是如何实现的。