【算法】数据结构与算法分析学习笔记——各类二叉查找树的吐血整理

看完《数据结构与算法分析》,各种二叉查找树简直看得要崩溃,这里整理一下,也便于以后自己使用。


  查找(平均/最坏) 插入(平均/最坏) 删除(平均/最坏) 优点 缺点
二叉查找树BST O(logN)/O(N) O(logN)/O(N) O(logN)/O(N) 编程代码最简单 树可能会不平衡,最坏情况会达到O(N)
AVL树 O(logN)/O(logN) O(logN)/O(logN) O(logN)/O(logN) 增加了平衡条件,保证了最坏情况依然是O(logN) 编程复杂,数据结构相对复杂
伸展树SplayTree O(logN)/O(N) O(logN)/O(N) O(logN)/O(N) 数据结构相对简单,虽然有最坏情况,但并不影响总体速度 仍然存在O(N)的情况
伸展树(自顶向下) O(logN)/O(N) O(logN)/O(N) O(logN)/O(N) 相比自底向上,非递归实现,且只需要O(1)的额外空间但摊还时间不变 代码复杂
红黑树RedBlackTree O(logN)/O(logN) O(logN)/O(logN) O(logN)/O(logN) AVL的变种,继承了AVL的时间,平衡的好 有大量的旋转,删除复杂,总体代码也复杂
AA-树 O(logN)/O(logN) O(logN)/O(logN) O(logN)/O(logN) 代码实现会大量简化,且时间继续保持 旋转的次数会相对多
treap树 O(logN)/O(N) O(logN)/O(N) O(logN)/O(N) 这是最简单的一种树了,效率甚至高于伸展树 依然是存在最坏情况的


二叉查找树BST:最原始的查找树,后面所有树都要叫它爸爸爷爷了,也不用多说啥。


AVL树:主要使用递归实现,非递归有点麻烦,通过记录每个节点的高度,当高度差达到2时,进行旋转,达到自平衡。实现可以参考:
http://blog.csdn.net/d521000121/article/details/54312142

伸展树SplayTree:思想是每次要找的都通过旋转放到根上(叫做展开),方便后续的查找,所以当某些数据连续被查找又或者要查找的数据非常接近,此时速度便会非常快。

                                   而且最坏情况不会保持。附上一个大神的博客:

   http://www.cnblogs.com/vamei/archive/2013/03/24/2976545.html


伸展树(自顶向下):从底向上需要递归,同时就是要额外空间,但自顶向下只需要常数空间即可,且可用非递归实现,所以个人认为这个算法会更快?

                                        注意这里生成的树与自底向上的会有区别。实现的话书上已经非常详细了。


红黑树RedBlackTree:AVL的变种,通过标记节点是红色还是黑色,再给树一系列的约束条件,达到自平衡的功能,从理论上也证明了生成的树已经接近最优。

  再附上大神博客:http://blog.csdn.net/chenhuajie123/article/details/11951777


AA-树:先有二叉B-树,再有BB-树,再加上一点红黑树的条件,就是AA-树(mdzz。。。)

       讲解这个比较好:http://blog.csdn.net/zhaojinjia/article/details/8121156,实现书上有


treap树:很简单的一个想法,就是查找二叉树+堆,对于每个节点,会生成一个随机数叫优先级,treap数除了满足查找二叉树的条件外,其节点的优先级要满足堆序,

 不满足的通过左旋转和右旋转维护。详细参考:http://blog.csdn.net/pi9nc/article/details/12244591

你可能感兴趣的:(算法)