给定多个节点,求 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 树的最小和最大高度? 的相关文章

  • ConcurrentLinkedDeque 与 LinkedBlockingDeque

    我需要一个线程安全的 LIFO 结构 并发现我可以使用线程安全的实现Deque为了这 Java 7 引入了ConcurrentLinkedDeque http docs oracle com javase 7 docs api java u
  • 相当于一个允许重复键的排序字典

    我需要一个数据结构 可以通过与对象关联的浮动键对对象进行排序 从低到低的在前 问题是键代表成本 所以经常有重复 我不关心这一点 因为如果两个具有相同的成本 我只会抓住第一个 因为它没有区别 问题是编译器抱怨 是否有一种数据结构的行为方式相同
  • 如何解析代码(Python)?

    我需要解析一些特殊的数据结构 它们采用某种类似 C 的格式 大致如下所示 Group GroupName C Style comment Group AnotherGroupName Entry some variables 0 3 141
  • 同步不经常更新的哈希图的最佳方式

    我有一个在应用程序中使用的 HashMap 数据是在应用程序初始加载期间从数据库填充的 然后它始终只是读取并且从不更新 会有多个线程不断地读取数据 由于数据永远不会更新 因此我们目前不使用任何同步 仅使用 HashMap 我们现在定义的方式
  • 如何在 dijkstra 算法中以 O(log n ) 时间更新优先级队列中的键?

    过去一周我一直在研究 dijkstra 算法 我在 java 中有正确的运行代码 它使用数组来计算标准 findMin 函数 该函数为您提供距离最小的顶点 显然它是 O n 现在我希望使用优先级队列 最小堆 来实现它 我的思考过程是 whi
  • 为什么在排序输入上插入到树中比随机输入更快?

    现在我一直听说从随机选择的数据构建二叉搜索树比有序数据更快 这仅仅是因为有序数据需要显式重新平衡以将树高度保持在最低限度 最近我实现了一个不可变的treap http en wikipedia org wiki Treap 一种特殊的二叉搜
  • 从日志文件中获取前 100 个 URL

    我的一位朋友在接受采访时被问到以下问题 谁能告诉我如何解决它 我们有一个相当大的日志文件 大约 5GB 日志文件的每一行都包含一个用户在我们网站上访问过的 URL 我们想要找出用户访问最多的 100 个 URL 怎么做 如果我们有超过 10
  • 在 Python 中进行模糊键查找的最佳方法?

    我遇到一个问题 我需要在哈希映射中进行模糊查找 即返回与最接近查询的键相对应的值 在我的例子中是通过 Levenshtein 距离测量的 我目前的方法是子类化dict使用特殊的查找方法计算所有键的编辑距离 然后返回得分最低的键的值 基本上是
  • TreeMap 删除所有大于某个键的键

    在项目中 我需要删除键值大于某个键的所有对象 键类型为Date 如果重要的话 据我所知TreeMapJava中实现的是红黑树 它是一种二叉搜索树 所以我应该得到O n 删除子树时 但除了制作尾部视图并一一删除之外 我找不到任何方法可以做到这
  • 生成二叉树的所有从根到叶的分支

    抱歉 如果这是一个常见问题 但我还没有找到适合我的特定问题的答案 我正在尝试实施一个walk方法将二叉树从根节点遍历到每个叶节点 每当到达叶节点时都会生成根到叶路径 例如 遍历表示为的二叉树 a b d c 会产生 a b c a d 我的
  • Linux内核container_of宏和C90中的通用容器

    是否有可能实施容器的 http lxr linux no linux tools perf util include linux kernel h L18纯C90中的宏 我不确定如何做到这一点 因为内核实现取决于海湾合作委员会黑客 http
  • 如何将列表转换为地图?

    最近我和一位同事讨论了转换的最佳方式是什么List to Map在 Java 中 这样做是否有任何具体的好处 我想知道最佳的转换方法 如果有人可以指导我 我将非常感激 这是个好方法吗 List
  • Scheme (Lisp) 中树的深度反转

    我对Scheme中的基本树数据结构进行了深度逆向 define deep reverse t cond null t not pair t t else cons deep reverse cdr t deep reverse car t
  • SQL 中的链表

    在 MySQL 数据库中存储链接列表的最佳方法是什么 这样插入就很简单 即 您不必每次都重新索引一堆内容 并且可以轻松地按顺序拉出列表 使用 Adrian 的解决方案 但不是增加 1 而是增加 10 甚至 100 然后可以按照要插入的内容之
  • stl 集的 C# 等效项是什么?

    我想使用 C 将一些值存储在平衡二叉搜索树中 我查看了泛型命名空间中的集合 但没有找到与 stl 集合等效的集合 我可以使用什么通用集合 我不想存储键 值对 只是值 你可以使用HashSet http msdn microsoft com
  • Python OO程序结构规划

    我是 OOP 的初学者 我想创建一个包含三个类 A B 和 C 的程序 该类的每个实例都由一组特征 Achar1 Achar2 等定义 该程序应该创建uses由 A 元素 B 元素和 C 元素以及开始日期和结束日期组成 A 和 B 都有子类
  • 在Python中寻找坐标系中某些点之间的最短路径

    我编写了一个代码 可以在坐标系中的特定宽度和长度范围内生成所需数量的点 它计算并列出我使用欧几里德方法生成的这些点的距离矩阵 我的代码在这里 import pandas as pd from scipy spatial import dis
  • 链表算法查找总和为 10 的对

    您能否建议一种算法来查找链表中加起来为 10 的所有节点对 我想出了以下内容 算法 比较每个节点 从第二个节点开始 每个节点从头节点开始直到前一个节点 在当前比较的节点之前 并报告所有此类对 我认为这个算法应该可以工作 但是它肯定不是最有效
  • 有人真正有效地实现了斐波那契堆吗?

    你们中有人曾经实施过斐波那契堆 http en wikipedia org wiki Fibonacci heap 几年前我就这样做了 但它比使用基于数组的 BinHeaps 慢了几个数量级 当时 我认为这是一个宝贵的教训 告诉我们研究并不
  • 为什么路径压缩不会改变 UnionFind 中的排名?

    我正在研究 UnionFind 的实现 并从这里进行排序和路径压缩http en wikipedia org wiki Disjoint set data struct Disjoint set forests http en wikipe

随机推荐

  • 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