算法基础篇(11)------平衡树
来源:互联网 发布:2016网络自制剧排行榜 编辑:程序博客网 时间:2024/05/29 12:31
● 每周一言
交流,时机很重要。
导语
能够表达一定元素顺序的二叉树叫二叉搜索树。二叉搜索树通常能在O(logN)的时间复杂度下查找某些节点的元素值,但是其容易退化成一条链使得时间复杂度变成O(N)。为解决这个问题,平衡树就诞生了。那么平衡树是如何解决这个问题的?其具体实现逻辑又是如何?
平衡树
平衡树(Balanced Binary Tree)由G.M. Adelson-Velsky 和 E.M. Landis于1962年发明,因此又名AVL树。平衡树满足二叉搜索树的所有条件,而为了解决二叉搜索树退化成链的情况,平衡树还能保证任意节点的左右子树高之差不大于1。下图是普通二叉搜索树与平衡树的对比:
当一棵二叉搜索树是一棵平衡树的时候,每次元素查找的时间复杂度能稳定在O(logN)。那么,平衡树是如何保证任意节点的左右子树高之差不大于1的呢?我们不妨先想想左右子树高之差大于1的情况一共有哪几种,下图总结了4种“大于1”的情况:
对比上图发现,通过镜面变换,(1)和(4)可归为一类,(2)和(3)可归为一类。为了把“大于1”的搜索树调整成平衡树,我们通过一种“旋转”操作来实现。其中,对(1)(4)类型进行单旋,对(2)(3)类型则进行双旋。
上图对(1)进行单旋:把B提到树根,A变成B的右孩子,E变成A的左孩子,得到平衡树。同理可单旋(4)。
上图对(2)进行双旋。分两步:首先旋转A的左子树,使B为根的左子树的左子树高度大于相对的右子树高度;然后将E提到树根,A变成E的右孩子,得到平衡树。同理可双旋(3)。
平衡树的建树时间复杂度为O(NlogN)。此外,平衡树还有红黑树、SBT、Treap、Splay等几个变种,由于时间关系就不在此一一讲述了,感兴趣的读者可自行查阅资料。敬请期待下节内容。
结语
感谢各位的耐心阅读,后续文章于每周日奉上,欢迎大家关注小斗公众号 对半独白!
0 0
- 算法基础篇(11)------平衡树
- 【基础算法】:平衡二叉树的插入
- 平衡树构造算法
- 平衡树 算法摘记
- 算法-平衡二叉树
- Splay平衡树 (LCT基础)
- 平衡二叉树算法详解
- 平衡二叉树算法详解
- 平衡二叉树算法分析
- 平衡二叉树算法分析
- 二叉排序树、二叉平衡树算法
- 平衡二叉树算法详解
- 算法Day10-平衡二叉树
- AVL树(平衡树)-基础
- 【数据结构基础】平衡二叉树(AVL)
- 《C算法》笔记11:BST再平衡
- 平衡二叉树的数组表示算法
- 【省选】算法总结——平衡树
- Erlang/OTP: 基于 Behaviour 的回调函数【转】
- A1063.Set Similarity
- 页面的分页(对之前上传的的代码的一种补充)
- Linux(2)简单的导航指令(下)绝对路径和相对路径
- 【JavaScript】2.JavaScript&html
- 算法基础篇(11)------平衡树
- 怪盗基德的滑翔翼
- PopUpWindow使用详解(一)——基本使用
- 怎么就是道DP题呢,666
- Hadoop完全分布式集群搭建手记(CentOS6.7+Hadoop2.6手把手胸贴胸详细版)
- 排列序数
- C++动态规划
- 常用调度算法
- 素数表 最快,最好记