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

● 每周一言

交流,时机很重要。

导语

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

平衡树

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

算法基础篇(11)------平衡树_第1张图片

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

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

上图对(1)进行单旋:把B提到树根,A变成B的右孩子,E变成A的左孩子,得到平衡树。同理可单旋(4)。
算法基础篇(11)------平衡树_第4张图片

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

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

结语

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

算法基础篇(11)------平衡树_第5张图片

你可能感兴趣的:(算法基础系列)