总结
二叉查找树:
任意一个节点所包含的键值,大于等于左孩子的键值,小于等于右孩子的键值。
此外,无论是左旋还是右旋,若旋转之前这棵树是二叉查找树,旋转之后它一定还是二叉查找树。
平衡树(AVL树):
AVL树中任何节点的两个子树的高度最大差别为1,LL,RR,LR,RL旋转算法。
对于1百万个节点的平衡树,树的高度为12-20之间,对于10亿个节点的平衡树,树的高度为18-30之间。
伸展树:
当某个节点被访问时,伸展树会通过旋转使该节点成为树根。
红黑树:
主要是用它来存储有序的数据,它的时间复杂度是O(lgn)),效率非常之高.
AVL树与红黑树比较:
AVL是严格平衡树,因此在增加或者删除节点的时候,根据不同情况,旋转的次数比红黑树要多。(所以AVL树插入和删除时间会稍微多)
红黑树是弱平衡的,用非严格的平衡来换取增删节点时候旋转次数的降低。
两者都属于自平衡二叉树,那么降低树的深度自然会提高查找效率。
两者查找,插入,删除的时间复杂度相同O(lgn)
时间复杂度比较
sequential search – 顺序查找
binary search – 二分查找
BST – 二叉查找树
2-3 tree – 平衡树
red-black tree – 红黑树
平衡树(AVL树):(http://www.cnblogs.com/skywang12345/p/3576969.html)
伸展树:(http://www.cnblogs.com/skywang12345/p/3604238.html)
红黑树原理:(http://www.cnblogs.com/skywang12345/p/3245399.html)
红黑树代码实现:(http://www.cnblogs.com/skywang12345/p/3624177.html)
平衡树(AVL树)
介绍
它是最先发明的自平衡二叉查找树,也被称为高度平衡树。
特点:AVL树中任何节点的两个子树的高度最大差别为1。
旋转
如果在AVL树中进行插入或删除节点后,可能导致AVL树失去平衡。4种姿态:LL(左左),LR(左右),RR(右右)和RL(右左)
LL(左左)旋转说明
就用手抓着”左孩子,即k1”使劲摇。将k1变成根节点,k2变成k1的右子树,”k1的右子树”变成”k2的左子树”。
伸展树
介绍
伸展树属于二叉查找树,即它具有和二叉查找树一样的性质。
特点:当某个节点被访问时,伸展树会通过旋转使该节点成为树根。这样做的好处是,下次要访问该节点时,能够迅速的访问到该节点。(某个节点到树根之间的路径,通过一系列的旋转把这个节点搬移到树根去)
红黑树
介绍
一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。
特点:
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
应用
Linux虚拟内存的管理,C++ STL中的set、map,Java集合中的TreeSet和TreeMap。
旋转与着色
详见博客