算法基础篇(11)------平衡树

● 每周一言

交流,时机很重要。

导语

能够表达一定元素顺序的二叉树叫二叉搜索树。二叉搜索树通常能在O(logN)的时间复杂度下查找某些节点的元素值,但是其容易退化成一条链使得时间复杂度变成O(N)。为解决这个问题,平衡树就诞生了。那么平衡树是如何解决这个问题的?其具体实现逻辑又是如何?

平衡树

平衡树(Balanced Binary Tree)由G.M. Adelson-Velsky 和 E.M. Landis于1962年发明,因此又名AVL树。平衡树满足二叉搜索树的所有条件,而为了解决二叉搜索树退化成链的情况,平衡树还能保证任意节点的左右子树高之差不大于1。下图是普通二叉搜索树与平衡树的对比:

fig1

当一棵二叉搜索树是一棵平衡树的时候,每次元素查找的时间复杂度能稳定在O(logN)。那么,平衡树是如何保证任意节点的左右子树高之差不大于1的呢?我们不妨先想想左右子树高之差大于1的情况一共有哪几种,下图总结了4种“大于1”的情况:
fig2

对比上图发现,通过镜面变换,(1)和(4)可归为一类,(2)和(3)可归为一类。为了把“大于1”的搜索树调整成平衡树,我们通过一种“旋转”操作来实现。其中,对(1)(4)类型进行单旋,对(2)(3)类型则进行双旋。
fig3

上图对(1)进行单旋:把B提到树根,A变成B的右孩子,E变成A的左孩子,得到平衡树。同理可单旋(4)。
fig4

上图对(2)进行双旋。分两步:首先旋转A的左子树,使B为根的左子树的左子树高度大于相对的右子树高度;然后将E提到树根,A变成E的右孩子,得到平衡树。同理可双旋(3)。

平衡树的建树时间复杂度为O(NlogN)。此外,平衡树还有红黑树、SBT、Treap、Splay等几个变种,由于时间关系就不在此一一讲述了,感兴趣的读者可自行查阅资料。敬请期待下节内容。

结语

感谢各位的耐心阅读,后续文章于每周日奉上,欢迎大家关注小斗公众号 对半独白

face

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值