http://blog.csdn.net/zwan0518/article/details/12219055
http://blog.csdn.net/v_july_v/article/details/6124989
http://blog.csdn.net/v_JULY_v/article/details/6114226
http://www.cnblogs.com/skywang12345/p/3245399.html

二叉搜索树:
因为,一棵由n个结点,随机构造的二叉查找树的高度为logn,所以,二叉查找树的一般操作(insert、delete、search)的执行时间为O(logn)。但二叉查找树若退化成了一棵具有n个结点的线性链后,则这些操作最坏情况运行时间为O(n)。
----算法导论有定理:一棵高度为h的二叉搜索树,一般操作的执行时间为O(h)。 在算法导论中 lgn = log2n,在大话数据结构里的表示:logn = log2n
红黑树:
1、算法导论中的定理:一棵含有n个节点的红黑树的高度至多为2log(n+1)。

红黑树虽然本质上是一棵二叉查找树,但它在二叉查找树的基础上增加了着色和相关的性质使得红黑树相对平衡,从而保证了红黑树的查找、插入、删除的时间复杂度最坏为O(logn)。

但它是如何保证一棵n个结点的红黑树的高度始终保持在logn的呢?这就引出了红黑树的5个性质:
1、每个结点要么是红的要么是黑的;
2、根结点是黑的;
3、每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的;
4、每个红色节点必须有两个黑色的子节点;
5、从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点(这个性质保证了--最长路径长度不超过最短路径长度的2倍)。

正是红黑树的这5条性质,使一棵n个结点的红黑树始终保持了logn的高度,从而也就解释了上面所说的“红黑树的查找、插入、删除的时间复杂度最坏为O(logn)”这一结论成立的原因。

红黑树是一种自平衡二叉查找树。它的统计性能要好于平衡二叉树(AVL树),但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除等操作。

红黑树的应用:
1、Java中的TreeSet和TreeMap,C++ STL中的set、map,以及Linux虚拟内存的管理
2、用红黑树管理进程控制块epoll在内核中的实现,用红黑树管理事件块;
3、Nginx中,用红黑树管理timer等;

与AVL树的区别:
1、红黑树的算法时间复杂度和AVL相同,但统计性能比AVL树更高。
1、红黑树和AVL树都能够以O(log2 n)的时间复杂度进行搜索、插入、删除操作。
2、由于设计,红黑树的任何不平衡都会在三次旋转之内解决。AVL树增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。
红黑树是一种比较宽泛化的平衡树,没AVL的平衡要求高,同时他的插入删除都能在O(logN)的时间内完成,而且对于其性质的维护,插入至多只需要进行2次旋转就可以完成,对于删除,至多只需要三次就可以完成,所以其统计性能要比AVL树好。最坏情况下,AVL树有最多O(logN)次旋转,而红黑树最多三次

在查找方面:
  红黑树的性质(最长路径长度不超过最短路径长度的2倍),其查找代价基本维持在O(logN)左右,但在最差情况下(最长路径是最短路径的2倍少1),比AVL要略逊色一点。
  AVL是严格平衡的二叉查找树(平衡因子不超过1)。查找过程中不会出现最差情况的单支树。因此查找效率最好,最坏情况都是O(logN)数量级的。

所以,综上:
  AVL比RBtree更加平衡,但是AVL的插入和删除会带来大量的旋转,执行的操作更多一些,效率更低一些。 所以如果插入和删除比较多的情况,应该使用RBtree, 如果查询操作比较多,应该使用AVL。

AVL是一种高度平衡的二叉树,维护这种高度平衡所付出的代价比从中获得的效率收益还大,故而实际的应用不多,更多的地方是用追求局部而不是非常严格整体平衡的红黑树。当然,如果场景中对插入删除不频繁,只是对查找特别有要求,AVL还是优于红黑的。

05-14 09:51