您的位置:首页 > 理论基础 > 数据结构算法

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

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

 查找(平均/最坏)插入(平均/最坏)删除(平均/最坏)优点缺点
二叉查找树BSTO(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)编程复杂,数据结构相对复杂
伸展树SplayTreeO(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)的额外空间但摊还时间不变代码复杂
红黑树RedBlackTreeO(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐