【译】Swift算法俱乐部-AVL树

栏目: Swift · 发布时间: 5年前

内容简介:AVL树是当二叉树的左右子树包含大致相同数量的节点时,称树是这是一个不平衡树的例子:

AVL树是 二叉搜索树 的自平衡形式,其中子树的高度最多只相差1。

当二叉树的左右子树包含大致相同数量的节点时,称树是 平衡的 。 这就是使树搜索速度非常快的原因。 但是如果二元搜索树不平衡,搜索会变得非常慢。

这是一个不平衡树的例子:

【译】Swift算法俱乐部-AVL树

所有的子节点都在左侧分支,没有一个在右侧分支。 这与 链表 基本相同。 因此,搜索需要 O(n) 时间,而不是您期望从二叉搜索树获得的更快的 O(log n)

该树的平衡版本如下所示:

【译】Swift算法俱乐部-AVL树

使二进制搜索树平衡的一种方法是以完全随机的顺序插入节点。 但这并不能保证成功,也不总是切实可行。

另一种解决方案是使用 自平衡 二叉树。 插入或删除节点后,此类型的数据结构会调整树以使其保持平衡。 这种树的高度保证为 log(n) ,其中 n 是节点的数量。 在平衡树上,所有插入,移除和搜索操作仅需 O(logn) 时间。 这意味着快速。;-)

介绍AVL树

AVL树通过向左或向右“旋转”树来修复任何不平衡。

如果AVL树中的节点在“高度”上的差异最大为1,则认为它是平衡的。如果树的所有节点都是平衡的,则树本身是平衡的。

节点的 height 是获取该节点最低叶子所需的步数。 例如,在下面的树中,从A到E需要三个步,因此A的高度为3。B的高度为2,C的高度为1,其他的高度为0,因为它们是叶节点。

【译】Swift算法俱乐部-AVL树

如上所述,在AVL树中,如果节点的左右子树具有相同的高度,则节点是平衡的。 当然不必是完全相同的高度,但差异不能大于1。这些都是平衡树的例子:

【译】Swift算法俱乐部-AVL树

以下是不平衡的树,因为左子树的高度与右子树相比太大了:

【译】Swift算法俱乐部-AVL树

左右子树的高度之间的差异称为 平衡因子(balance factor) 。 计算方法如下:

balance factor = abs(height(left subtree) - height(right subtree))

如果在插入或删除后平衡因子变得大于1,那么我们需要重新平衡AVL树的这一部分。 这是通过旋转完成的。

译注: abs 是绝对值的意思。

旋转

每个树节点在变量中跟踪其当前平衡因子。 插入新节点后,我们需要更新其父节点的平衡因子。 如果该平衡因子大于1,我们“旋转”该树的一部分以恢复平衡。

【译】Swift算法俱乐部-AVL树

对于旋转,我们使用术语:

  • Root - 将要旋转的子树的父节点;
  • Pivot - 旋转后将成为父节点(基本上位于 Root 位置)的节点;
  • RotationSubtree - 旋转侧的 Pivot 的子树
  • OppositeSubtree - 与旋转侧相对的 Pivot 的子树

让我们举一个使用 (顺时针方向)旋转来平衡不平衡树的示例:

【译】Swift算法俱乐部-AVL树 【译】Swift算法俱乐部-AVL树 【译】Swift算法俱乐部-AVL树

旋转步骤可以通过以下方式描述:

  1. RotationSubtree 指定为 Root 的新 OppositeSubtree ;
  2. Root 指定为 Pivot 的新 RotationSubtree ;
  3. 检查最终结果

用伪代码,上面的算法可以写成如下:

Root.OS = Pivot.RS
Pivot.RS = Root
Root = Pivot

这是一个恒定时间操作 - O(1) 插入永远不需要超过2次旋转。 删除可能需要最多 log(n) 轮换。

代码

AVLTree.swift 中的大多数代码只是常规 二叉搜索树 的东西。 您可以在二叉搜索树找到大部分实现。 例如,搜索树是完全相同的。 AVL树唯一不同的是插入和删除节点。

注意:如果你对二叉搜索树的常规操作有点模糊,我建议你 看这边 。 这会使AVL树更容易理解。

有趣的位在 balance() 方法中,在插入或删除节点后调用。

扩展阅读

AVL树的维基百科

AVL树是第一个自平衡二叉树。 最近, 红黑树 似乎更受欢迎。

作者:Mike Taghavi, Matthijs Hollemans

翻译: Andy Ron


以上所述就是小编给大家介绍的《【译】Swift算法俱乐部-AVL树》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

老码识途

老码识途

韩宏 / 电子工业出版社 / 2012-8 / 56.00元

《老"码"识途:从机器码到框架的系统观逆向修炼之路》以逆向反汇编为线索,自底向上,从探索者的角度,原生态地刻画了对系统机制的学习,以及相关问题的猜测、追踪和解决过程,展现了系统级思维方式的淬炼方法。该思维方式是架构师应具备的一种重要素质。《老"码"识途:从机器码到框架的系统观逆向修炼之路》内容涉及反汇编、底层调试、链接、加载、钩子、异常处理、测试驱动开发、对象模型和机制、线程类封装、跨平台技术、插......一起来看看 《老码识途》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

URL 编码/解码
URL 编码/解码

URL 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试