给定多个节点,求 AVL 树的最小和最大高度?

2023-12-24

给定一定数量的节点,是否有公式可以计算 AVL 树的最大和最小高度?

例如:
课本问题:
3 个节点、5 个节点和 7 个节点的 AVL 树的最大/最小高度是多少?
课本答案:
3 个节点的 AVL 树的最大/最小高度为 2/2,5 个节点的 AVL 树的最大/最小高度为 3/3,7 个节点的 AVL 树的最大/最小高度为 4/3

我不知道他们是否通过某种神奇的公式得出了这个结果,或者他们是否为每个给定的高度绘制了 AVL 树并以此方式确定了它。


The solution below is appropriate for working things out by hand and gaining an intuition, please see the exact formulas at the bottom of this answer for larger trees (54+ nodes).1

Well the minimum height2 is easy, just fill each level of the tree with nodes until you run out. That height is the minimum.

要找到最大值,请执行与最小值相同的操作,但然后返回一步(删除最后放置的节点)并查看将该节点添加到相反的子树(从它刚刚所在的位置)是否违反 AVL 树属性。如果是这样,您的最大身高就是您的最小身高。否则这个新高度(应该是最小高度+1)就是你的最大高度。

如果您需要概述 AVL 树的属性,或者只是 AVL 树的一般解释,维基百科是一个很好的起点。 http://en.wikipedia.org/wiki/AVL_tree

Example:

我们以 7 节点为例。您填充所有级别并找到高度为 3 的完全填充的树。(1 个位于第 1 级,2 个位于第 2 级,4 个位于第 3 级。1+2+4=7 个节点。)这意味着 3 是您的最小值。

现在找到最大值。删除最后一个节点并将其放置在左子树而不是右子树上。右子树的高度仍然为 3,但左子树的高度现在为 4。但是这些值相差不到 2,因此它仍然是 AVL 树。因此你的最大高度是 4。(即 min+1)

下面列出了所有三个示例(请注意,数字对应于放置顺序,不值):


公式:

The technique shown above doesn't hold if you have a tree with a very large number nodes. In this case, one can use the following formulas to calculate the exact min/max height2.

Given n nodes3:

Minimum: ceil(log2(n+1))

Maximum: floor(1.44*log2(n+2)-.328)

如果您好奇的话,第一次 max-min>1 是在 n=54 时。

1Thanks to Jamie S https://stackoverflow.com/users/6553450/jamie-s for bringing this failure at larger node counts to my attention.

2Technically, the height of a tree is the longest path length (in edges) between the root and any leaf node https://en.wikipedia.org/wiki/Tree_(data_structure)#Terminology. However the OP's textbook uses a common alternate definition of height as the number of levels in a tree. For consistency with the OP and Wikipedia, we use that definition in this post as well.

3These formulas are from the Wikipedia AVL page https://en.wikipedia.org/wiki/AVL_tree#Properties, with constants plugged in. The original source is Sorting and searching by Donald E. Knuth (2nd Edition).

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

给定多个节点,求 AVL 树的最小和最大高度? 的相关文章

  • java数据结构模拟数据树

    我需要帮助定义使用什么方法 我有一个 SOAP 响应 给我一个 xml 文件 我需要在屏幕上显示 3 个相关列表 当您在第一个列表中选择一个项目时 相应的选择将出现在第二个列表中 依此类推 我只对从 xml 流中提取数据后如何有效地组织数据
  • 解释这段代码的工作原理;子进程如何返回值以及在哪里返回值?

    我不明白子进程如何返回该值以及返回给谁 输出为 6 7 问题来源 http www cs utexas edu mwalfish classes s11 cs372h hw sol1 html http www cs utexas edu
  • 子序列和

    给定一个整数数组 例如 1 2 3 1 查找是否存在总和为0并返回它 例如 1 2 3 or 2 3 1 检查每个子序列是O n 2 这效率太低了 有改进的想法吗 创建一个新数组 其中每个元素等于前一个元素加上该元素的总和 Input 1
  • 生成二叉树的所有从根到叶的分支

    抱歉 如果这是一个常见问题 但我还没有找到适合我的特定问题的答案 我正在尝试实施一个walk方法将二叉树从根节点遍历到每个叶节点 每当到达叶节点时都会生成根到叶路径 例如 遍历表示为的二叉树 a b d c 会产生 a b c a d 我的
  • 大数据使用什么数据结构

    我有一个包含一百万行的 Excel 工作表 每行有 100 列 每行代表一个具有 100 个属性的类的实例 列值是这些属性的值 哪种数据结构最适合在这里使用来存储数百万个数据实例 Thanks 这实际上取决于您需要如何访问这些数据以及您想要
  • 我是否需要采取明确的操作来促进与持久数据结构的共享?

    我来自命令式背景 正在尝试实现一个简单的不相交集 并集查找 数据结构 以获得在 Haskell 中创建和修改 持久 数据结构的一些练习 目标是有一个简单的实现 但我也关心效率 我的问题与此相关 首先 我创建了一个按等级并集的不相交集森林实现
  • 如何从 Trie 中检索给定长度的随机单词

    我有一个简单的 Trie 用来存储大约 80k 长度为 2 15 的单词 它非常适合检查字符串是否是单词 但是 现在我需要一种获取给定长度的随机单词的方法 换句话说 我需要 getRandomWord 5 来返回 5 个字母的单词 所有 5
  • Java:避免在数组列表中插入重复项

    我是java新手 我有一个ArrayList我想避免插入时重复 我的ArrayList is ArrayList
  • Java 中具有级别顺序插入的完整二叉搜索树

    我们接到一个任务 需要编码 二叉搜索树 那个树has to be complete not perfect 这意味着所有不在最低级别或次低级别的节点都应该有 2 个子节点 而最低级别的节点应尽可能远离左侧 我们需要插入到树中等级顺序 所以如
  • Python OO程序结构规划

    我是 OOP 的初学者 我想创建一个包含三个类 A B 和 C 的程序 该类的每个实例都由一组特征 Achar1 Achar2 等定义 该程序应该创建uses由 A 元素 B 元素和 C 元素以及开始日期和结束日期组成 A 和 B 都有子类
  • 将结构体数组传递给函数 C++

    抱歉这个菜鸟问题我只是有点困惑 如果我在 main 中有一个结构数组 我想将其传递给函数 struct MyStruct int a int b char c mayarray 5 MyStruct StructArray 10 myFun
  • 沿着长数据序列在固定大小的移动窗口中查找中值

    给定一个数据序列 可能有重复项 一个固定大小的移动 窗口 从数据开始处每次迭代时移动窗口 序列 使得 1 从窗口中删除最旧的数据元素并添加新数据 元素被推入窗口 2 求每次移动时窗口内数据的中位数 以下帖子没有帮助 有效地找到随机序列的中值
  • 有人真正有效地实现了斐波那契堆吗?

    你们中有人曾经实施过斐波那契堆 http en wikipedia org wiki Fibonacci heap 几年前我就这样做了 但它比使用基于数组的 BinHeaps 慢了几个数量级 当时 我认为这是一个宝贵的教训 告诉我们研究并不
  • XML 模式文件中 xs 和 xsd 之间的区别?

    两者有什么区别xs and xsdXML 模式文件中的前缀 From w3 org 上的 XSD 1 0 规范 http www w3 org TR xmlschema 1 Instance Document Constructions 模
  • 给定一个数字 0-9 的数组和一个整数 n,找到可由输入数组组成且小于 n 的所有整数

    问题是这样的 给你一个数字 0 9 的数组和一个整数n 该数组可能包含任何给定数字的重复项 找到所有可以通过连接输入数组中的数字形成的整数并且小于n 输入数组中的数字可以在输出的元素中重复 例如 输入为 2 5 8 且 n 223 则输出应
  • 从 Linq 的列表中选择多个字段

    在 ASP NET C 中 我有一个结构 public struct Data public int item1 public int item2 public int category id public string category
  • 如何防止 Nil 将容器恢复为其默认值?

    我正在实现一个简单的链表并表示没有下一个节点的事实 我正在使用该值Nil 问题是当分配给容器时 Nil将尝试将容器恢复为其默认值 这意味着我需要使用容器的默认值或Any确定是否已到达链表的末尾 不过 我还是想用Nil 如果只是为了其明确的意
  • 如何返回 Solidity 中的结构数组?

    我正在为以太坊智能合约设计一个解决方案bidding 用例包括保留名称 例如 myName 并分配给一个地址 然后 人们可以竞标该名称 在本例中为 myName 可以有多个名称发生多次此类出价 struct Bid address bidO
  • 读取结构体定义的二进制文件

    有人可以指出我如何读取由 C 结构体定义的二进制文件的正确方向吗 它的结构内部有一些 define 这让我觉得它会让事情变得复杂 结构看起来像这样 尽管它比这更大 更复杂 struct Format unsigned long str to
  • 转换位域结构的字节顺序

    我需要将位字段结构从小端架构转换为大端架构 最好的方法是什么 因为如果我只是交换结构元素 字节边界就会出现问题 前结构是 struct unsigned int b1 1 unsigned int b2 8 unsigned int b3

随机推荐

  • Plotly 和袖扣在 Anaconda 中不起作用

    我一直在上一门关于数据科学和机器学习的课程 在其中一课中 它要求我下载并使用plotly和袖扣 我成功下载并安装了它们 也成功导入了它们 但是 当尝试使用 iplot 使用它们时 它给了我一个错误 下面我附上了错误的屏幕截图 所以我想知道如
  • Swift Spritekit 等距地图触摸位置

    我已经开始做一个小型 swift spritekit 项目来自学游戏开发 它从我设法绘制的等轴测图开始 但我无法在地图的不同图块上获得精确的触摸位置 它可以工作 但有点不合适 而且看起来不一致 这是我的职能 class PlayScene
  • 使用 GoogleFinanceSource 函数通过 tm.plugin.webmining 包进行文本挖掘

    我正在在线书籍上学习文本挖掘整洁的文本挖掘 http tidytextmining com 在第五章中 http tidytextmining com dtm html financial http tidytextmining com d
  • 如何从 websocket(客户端)打印流信息?

    我想使用 websocket 打印流信息 服务器间歇性地发送信息 我正在使用while True 在下面的Python代码中循环 有没有更好的办法 from websocket import create connection def co
  • 具有恒定笔画虚线数组对象的 SVG 弧形进度条

    这是我的JSfiddle https jsfiddle net 9005q67j 我正在尝试制作一个 SVG Arc 进度条 在进度条的末尾有一个常量对象 当我使用 JavaScript 为其设置动画时 常量对象在达到 100 时会移至另一
  • 如何在 Eclipse 中激活 Faces 配置编辑器?

    当我在 eclipse 中创建 JSF2 0 项目时 打开它的 faces config xml 文件总是会启动 faces 配置编辑器 但现在我有一个 Google AppEngine 项目 并且我已经手动添加了 JSF2 和 Prime
  • 元数据中的启动脚本未运行(Python、Google Compute Engine、云存储触发器)

    我有一个在 Google App Engine 上运行的应用程序 以及一个在 Google Compute Engine 上运行的 AI 我触发 VM 实例在 Google Cloud Storage 存储桶中发生更改时启动 并尝试将启动脚
  • Rscript 问题 - 使用不同版本的 R?

    我正在尝试在 Rscript 中加载库 但它给了我一个奇怪的错误 我正在运行 2 12 1 版本的 Rscript 二进制文件 但它抱怨我的包是在版本 2 12 1 下构建的 知道这是怎么回事吗 17 55 13 trash tmp R L
  • 为生产调整 Rails 性能?

    我即将部署一个基于 Rails 3 1 x 构建的应用程序 并开始运行一些性能测试 摆弄之后ab有一段时间 我在 Heroku 上看到了一些非常令人沮丧的结果 每秒产生大约 15 个请求 在本地测试时 我看到类似的结果 这确实表明这是一个应
  • org.hibernate.ObjectNotFoundException:不存在具有给定标识符的行:单表查询

    我正在使用 hibernate 进行一个简单的查询 没有连接 我想做的就是从表中检索最大 id 这项服务几个月来一直运行良好 但突然在过去两周内 我收到了可怕的 No row with the给定标识符存在错误 即使这个表包含数百万行 怎么
  • 如何使用 defaultdict 行为扩展 OrderedDict

    我有一个清单OrderedDict对象 我想将它们全部组合在一起 然后按每个中的水果属性对它们进行排序 我一直在尝试使用组合和排序它们defaultdict使用下面的代码 super dict apple defaultdict list
  • 如何在django中操作用户上传的文件而不保存它?

    我正在制作一个应用程序 它从 csv 文件获取数据并使用它生成图表 所有文件都包含相同的结构 由于服务器价格的原因 我决定不存储这些文件 我现在将使用 heroku 来托管这个应用程序 这是一个 Django 应用程序 我想知道如何才能使用
  • 如何切换到新的远程git存储库

    我最近将一个存储库克隆到本地驱动器 但现在我尝试将所有更改推送到一个完整的新存储库 然而 git 不断告诉我权限被拒绝 这是因为它正在尝试推送到最初克隆的存储库 DETAILS 我最初克隆自https github com taylonr
  • XSLT:如何查找节点的唯一子节点的数量?

    我的 XML 看起来像这样
  • 从 P7M 获取签名内容

    我正在使用 java jdk 1 7 和 bouncycastle 库来获取 p7m 签名文件的内容 在构建路径中 我添加了以下文件 bcpkix jdk15on 160 jar commons io 2 1 jar log4j 1 2 1
  • 服务器端控件的输入类型

    我正在使用 asp net 构建 ipad web 应用程序 我知道使用input type email 将导致 iPad 上的键盘布局发生更改 以便比默认设置更轻松地处理电子邮件输入 问题是我正在使用服务器端文本框控件 有谁知道如何让服务
  • 如何锁定滑块并防止用鼠标将值更新到 dat.GUI 菜单中

    我尝试实现一种方法来防止用鼠标更新值 实际上当three js动画已开始 通过单击按钮启动 目前 我有以下内容dat GUI menu 单击 开始 按钮后 我想阻止用户用鼠标修改参数 Rotation x and Rotation y 这是
  • 列表作为字典中不可 JSON 序列化的条目

    我需要将列表 或 numpy 数组 保存为 JSON 文件中的条目之一 我收到 不可 JSON 序列化 错误 并且我不知道如何修复它 以及为什么当我手动将列表传递到字典时我没有收到它 My code def get col stats co
  • 使用 AlaSQL 和 JQuery 加载 CSV 文件

    我正在构建一个基于 HTML 的应用程序 用于使用 AlaSQL 查询导入的 CSV 文件 我开始于这个演示 http alasql org demo 008file 并尝试通过设置来实现相同的行为onChange事件通过 JQuery 而
  • 给定多个节点,求 AVL 树的最小和最大高度?

    给定一定数量的节点 是否有公式可以计算 AVL 树的最大和最小高度 例如 课本问题 3 个节点 5 个节点和 7 个节点的 AVL 树的最大 最小高度是多少 课本答案 3 个节点的 AVL 树的最大 最小高度为 2 2 5 个节点的 AVL