删除导致 2 次旋转的最小 AVL 树大小是多少?

2024-04-15

众所周知,从 AVL 树中删除可能会导致多个节点最终不平衡。我的问题是,需要 2 次旋转的最小尺寸 AVL 树是多少(我假设左右或右左旋转是 1 次旋转)?我目前有一棵有 12 个节点的 AVL 树,删除它会导致 2 次旋转。我的 AVL 树按以下顺序插入:

8、5、9、3、6、11、2、4、7、10、12、1。

如果删除 10,则 9 会变得不平衡并发生旋转。这样做时,8 变得不平衡,并发生另一次旋转。是否存在较小的树,删除后需要旋转 2 次?

阅读 jpalecek 的评论后,我真正的问题是:给定一些常数 k,在 1 次删除后具有 k 次旋转的最小尺寸 AVL 树是多少?


在最坏的情况下,四个节点的树需要一次旋转。最坏情况下的删除数量随着列表中的每个术语而增加:4、12、33、88、232、609、1596、4180、10945、28656,...

This is 斯隆的 A027941 http://oeis.org/A027941是一个斐波那契类型序列,可以通过以下方式生成N(i)=1+N(i-1)+N(i-2) for i>=2, N(1)=2, N(0)=1.

要了解为什么会这样,首先请注意,旋转不平衡的 AVL 树会将其高度降低一倍,因为其较短的腿被延长,但牺牲了较长的腿。

当一个节点从 AVL 树中删除时,AVL 算法会检查所有被删除节点的祖先是否有潜在的重新平衡。因此,为了回答您的问题,我们需要识别给定高度的节点数最少的树。

在这样的树中,每个节点要么是叶子,要么具有+1或-1的平衡因子:如果节点的平衡因子为零,则这意味着可以在不触发重新平衡的情况下删除节点。我们知道重新平衡会使树变短。

下面,我展示了一组最坏情况的树。您可以看到,在序列中的前两棵树之后,每棵树都是通过连接前两棵树来构造的。您还可以看到每棵树中的每个节点要么是叶子,要么具有非零平衡因子。因此,每棵树的节点数都有最大高度。

对于每棵树,在最坏的情况下,左子树的删除将导致旋转,最终将该子树的高度减少一。这平衡了整个树。另一方面,从右子树中删除节点可能最终导致树不平衡,导致根旋转。因此,正确的子树是最重要的。

您可以验证在最坏的情况下,树 (c) 和树 (d) 在移除后有一次旋转。

树(c)作为树(e)的右子树出现,树(d)作为树(f)的右子树出现。当树 (c) 或 (d) 中触发旋转时,这会缩短树,从而导致树 (d) 和 (f) 中的根旋转。显然,这个序列还在继续。

如果你计算树中的节点数量,这与我原来的陈述相符并完成了证明。

(在下面的树中,删除突出显示的节点将导致新的最大旋转数。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

删除导致 2 次旋转的最小 AVL 树大小是多少? 的相关文章

  • 我想优化这个短循环

    我想优化这个简单的循环 unsigned int i while j 0 j is an unsigned int with a start value of about N 36 000 000 float sub 0 i 1 unsig
  • 两个非嵌套循环的大 O 表示法

    对于两个非嵌套的 for 循环 大 O 表示法是什么 Example for int i 0 i
  • 哪种数据聚类算法适合检测时间序列事件中未知数量的聚类?

    这是我的场景 考虑在不同地点和时间发生的一组事件 例如 考虑有人在高空记录暴风雨期间城市中的雷击 就我的目的而言 闪电是瞬时的 只能击中某些位置 例如高层建筑 还可以想象每次雷击都有一个唯一的 ID 以便以后可以参考该雷击 这个城市大约有1
  • 如何从二叉搜索树中均匀随机地返回节点?

    给定一个 BST 可能平衡也可能不平衡 如何能够均匀地随机返回 任何 节点 一个限制是您不能使用外部索引数据结构 您必须以每个节点都有平等被访问的机会的方式遍历树 这个问题让我困惑了好一阵子 如果我们确实可以使用外部哈希表 指针 我们可以对
  • 在 Java 中实现排列算法的技巧

    作为学校项目的一部分 我需要编写一个函数 该函数将接受整数 N 并返回数组 0 1 N 1 的每个排列的二维数组 该声明看起来像 public static int permutations int N 该算法描述于http www usn
  • 如何在给定目标索引数组的情况下对数组进行就地排序?

    你如何对给定的数组进行排序arr in place给定目标索引数组ind 例如 var arr A B C D E F var ind 4 0 5 2 1 3 rearrange arr ind console log arr gt B E
  • 编程 Pearls - 随机选择算法

    Programming Pearls 第一版第 120 页介绍了从 N 个整数总体中选择 M 个等概率随机元素的算法 InitToEmpty Size 0 While Size lt M do T RandInt 1 N if not Me
  • 删除队列中的最后一个元素

    我需要删除队列的最后一个元素 我唯一可以使用的操作是 Peek 获取第一个元素而不删除它 Enqueue element 向队列末尾插入一个元素 Dequeue 删除第一个元素 IsEmpty true 或 false 队列是否为空 而且我
  • 如何确定算法函数的复杂度?

    您如何知道算法函数对于特定操作是否需要线性 常数 对数时间 它取决于CPU周期吗 您可以通过三种方式 至少 做到这一点 在网上查找算法 看看它是如何描述其时间复杂度的 根据输入大小 自己检查算法 查看嵌套循环和递归条件等内容 以及每个循环运
  • 如何将一组重叠范围划分为不重叠范围?

    假设您有一组范围 0 100 一 0 75 b 95 150 c 120 130 d 显然 这些范围在某些点上重叠 您将如何剖析这些范围以生成不重叠范围的列表 同时保留与其原始范围相关的信息 在本例中为范围后面的字母 例如 运行算法后的上述
  • 由周期表元素形成的最大单词的算法

    我想为以下问题场景编写一个算法 根据元素周期表元素的名称 找到可以组成的最大单词 符号如Na Ne等应被视为单个元素 这是在一家知名公司的求职面试中被问到的 有人可以帮我解决这个问题吗 我认为更好的方法是检查字典中的每个单词 看看是否可以从
  • 时间复杂度和运行时间有什么区别?

    时间复杂度和运行时间有什么区别 它们是一样的吗 运行时间是指程序运行所需的时间 时间复杂度是对输入大小趋于无穷大时运行时间渐进行为的描述 您可以说运行时间 是 O n 2 或其他什么 因为这是描述复杂性类和大 O 表示法的惯用方式 事实上
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • 如何仅使用单个数组在 JavaScript 中模拟调用堆栈

    我正在看维基百科页面 https en wikipedia org wiki Call stack在调用堆栈上 并尝试理解这个图像 据我所知 哈哈 const memory memory 0 3 top of stack pointer m
  • 使用多级解决方案计算二维网格中的最近邻

    我有一个问题 在 x y 大小的网格中 我提供了一个点 并且我需要找到最近的邻居 在实践中 我试图在 pygame 中找到距离光标最近的点 该点跨越颜色距离阈值 计算如下 sqrt rgb1 0 rgb2 0 2 rgb1 1 rgb2 1
  • 在常数空间中创建 1..N 的随机排列

    我正在寻找枚举固定空间中数字 1 N 的随机排列 这意味着我无法将所有数字存储在列表中 原因是 N 可能非常大 超过可用内存 我仍然希望能够一次遍历这样一个数字的排列 只访问每个数字一次 我知道对于某些 N 可以这样做 许多随机数生成器随机
  • 使用并集查找(又名不相交集)检测图是否是二分图

    我正在 Spoj 上做一个问题 基本上可以简化为检测图是否是二分图 我正在尝试使用 dfs 为图表着色 但它太慢了 有人评论这个 没有 bfs 没有 dfs 没有二部图 简单的并查集就可以做到 确实速度很快 提示 1 偶数长度的环不会影响两
  • 计算两点之间的最短路线

    过去几周我一直在开发一款多人 HTML5 游戏 使用nodejs and websockets 我已经被这个问题困扰了一段时间 想象一下 我用数组实现了这个平铺地图 如下所示 1 or 棕色瓷砖 路上有障碍物 玩家无法通过 0 or 绿色瓷
  • 具有多个谓词的 C++11 算法

    功能如std find if来自algorithmheader 确实很有用 但对我来说 一个严重的限制是我只能为每次调用使用 1 个谓词count if 例如给定一个像这样的容器std vector我想同时应用相同的迭代find if 多个

随机推荐

  • 设备支持 ,但 APK 仅支持 x86

    我正在尝试通过 Android 模拟器为不同的 CPU ABis 部署和调试应用程序 但出现此错误 它没有指定模拟器支持哪些 ABI 我尝试运行支持所有 ABI 的 APK 但仍然遇到相同的错误 这种情况仅发生在具有 Google Play
  • 在大表上添加索引需要很长时间

    我有一个表 在 MySQL 中 名为unused大约有 540 万行 该表如下所示 CREATE TABLE unused id bigint 20 NOT NULL AUTO INCREMENT account id bigint 20
  • 在 apache 配置中创建变量

    我有一个 apache 配置 如下所示 RewriteCond QUERY STRING site eu jp in NC RewriteRule fetchHomePage action https example com 1 R 301
  • 当核心数据中没有找到相关实体时,无法识别的选择器发送到实例

    我有一个核心数据问题 我有两个实体 第二个实体与第一个实体是一对多关系 当尝试在第一个视图控制器上加载第一个视图控制器的详细信息和第二个详细信息的 UITableView 时 我希望此 tableView 代码允许我在找到记录时显示一个空白
  • 在实体框架代码优先中为同一个表定义多个外键

    我的 MVC 应用程序中有两个实体 我使用 Entity Framework 6 Code First 方法填充数据库 Student实体中有两个city id 其中一个用于出生城市 另一个用于工作城市 当我按上面定义外键时 迁移后会在 S
  • 来自task_struct的完整进程名称

    我想从中获取完整的进程名称struct task struct The comm字段仅存储 16 个字符 而进程名称可以更长 有没有办法获得完整的进程名称 这可以通过获取来完成struct vm area struct from task
  • QGLWidget 比 QWidget 慢

    问题主要是在标题中确定的 我尝试了 Qt 的示例 二维绘画 http harmattan dev nokia com docs library html qt4 opengl 2dpainting html 并注意到 如果我尝试在 QGLW
  • JAX-RS 服务抛出 404 HTTPException 但客户端收到 HTTP 500 代码

    我有一个 RESTful 资源 它调用 EJB 来进行查询 如果查询没有结果 EJB 将抛出 EntityNotFoundException 在 catch 块中 将抛出 javax xml ws http HTTPException 代码
  • Sqlalchemy 返回 SELECT 命令的不同结果(query.all)

    我有网络服务器 512 RAM FLASK SQLAlchemy SQLite gt uWSGI gt Nginx 问题 Sqlalchemy 返回 SELECT 命令 query all 的不同结果 Example 在数据库中添加了一些记
  • 在 C# 中获取实际日期时间而不是系统日期时间

    我正在构建的应用程序的一部分只能在特定时间段内访问 我知道我们可以使用以下属性获取当前系统时间DateTime在 C 中 如果我使用DateTime属性 然后用户可以更改系统时间并在需要时访问应用程序的部分 请告诉我如何在 C 中获取实际当
  • 如果没有 catch 或 finally 块,Scala 的“try”意味着什么?

    与 Java 不同 Scala 允许您进行简单的 尝试 无需 catch 或 finally 子句 scala gt try println Foo Foo 这实际上还有什么意义吗 println Foo Scala 的异常处理通过将任何异
  • 在另一个表中查找具有两条特定记录的记录

    我有一个Product模型那个has and belongs to many taxons 我想找到特定分类群中的所有产品 例如 如果产品同时属于 Ruby on Rails 和 Shirts 分类单元 我希望该产品在数据集中返回 但是no
  • 如何从 Vec 或 Slice 读取 (std::io::Read)?

    Vec支持std io Write 因此可以编写需要File or Vec 例如 从 API 参考来看 两者都不是Vec也不支持切片std io Read 有没有方便的方法来实现这一目标 是否需要编写包装结构 这是一个工作代码的示例 它读取
  • 无法访问 NPM 环境变量

    在我的 package json 中 我将一个名为 foo 的配置变量设置为 bar 并且我使用 NPM 脚本调用该变量 config foo bar scripts test echo npm package config foo Run
  • Python list.pop(i) 时间复杂度?

    我上网查了一下才知道list pop 时间复杂度为 O 1 但list pop i 时间复杂度为 O n 当我写 leetcode 时 很多人都使用pop i 在 for 循环中 他们说它是 O n 时间复杂度 事实上它比我的代码更快 我的
  • 通过 maven 插件在 OpenLiberty 中安装默认数据源

    我试图为 openliberty 20 0 0 1 设置 DefaultDataSource The src liberty config server xml is
  • 如何通过 RTTI 设置/获取 TStringGrid.Cells 等复杂事物的属性值?

    我将值存储在 xml 和 lua 代码中 并通过 RTTI 访问对象的属性 var o v TValue o is current object a TStringDynArray params as array ctx TRttiCont
  • 符号 errno 转字符串

    是否有一个命令行工具可以获取符号 errno 例如EINVAL并打印相应的字符串 Invalid argument 我想避免在我的系统上发现 EINVAL 的值为 22 然后使用 perror 22 理想情况下我可以写一些类似的东西 错误命
  • 为什么 C 没有二进制文字?

    我经常希望我能在 c 中做这样的事情 val1 0b00001111 clear high nibble val2 0b01000000 set bit 7 val3 0b00010000 clear bit 5 使用这种语法似乎是对 C
  • 删除导致 2 次旋转的最小 AVL 树大小是多少?

    众所周知 从 AVL 树中删除可能会导致多个节点最终不平衡 我的问题是 需要 2 次旋转的最小尺寸 AVL 树是多少 我假设左右或右左旋转是 1 次旋转 我目前有一棵有 12 个节点的 AVL 树 删除它会导致 2 次旋转 我的 AVL 树