data-structures - 找到 AVL 树的最小“内部”节点?
问题描述
我知道如何使用公式 n(h) = n(h-1) + n(h-2) + 1 找到高度为 h 的 AVL 树(包括外部节点)中的最小节点数,但我想知道如果有一个公式可以仅找到高度为 h 的 AVL 树的最小内部节点。
所以对于 n(3) = 4,如果我们只计算内部节点。n(4) = 7,如果我们只计算内部节点。我可以把它画出来并计算内部节点,但是当你得到更大的 AVL 树时,它就会变得一团糟。
我似乎在这方面找不到任何东西,试图找到一个答案一致的模式只会导致数小时的挫败感。提前致谢。
解决方案
是的,有一个很好的方法来计算这个。让我们从两个最简单的 AVL 树开始,它们的阶数为 0 和阶数为 1:
* *
|
*
第一棵树没有内部节点,第二棵树有一个内部节点。这为我们提供了递归关系的基本情况:
- 我(0)= 0
- 我(1) = 1
从这里,我们注意到在 n+2 阶的 AVL 树中获得最少内部节点的方法是选择 n 和 n+1 阶的两棵树作为具有最少内部节点的子树(最小化节点数)可能的。结果树的内部节点数等于两个子树中的内部节点数,再加上一个新根。这意味着
- I(n+2) = I(n) + I(n+1) + 1。
应用这个递归给了我们序列
0、1、2、4、7、12、20 等
嘿 - 我们以前在什么地方见过这个吗?我们有!在每个术语中添加一个给我们
1、2、3、5、8、13、21等
这是斐波那契数列,向下移动了两个位置!所以我们的假设是
I(n) = F(n+2) - 1
你可以通过对 n 的归纳来证明这一点。
这是获得此结果的另一种方法。想象一下,您采用高度为 n 的 AVL 树并删除所有叶子。您现在留下了高度为 n-1 的 AVL 树(证明这一点!),并且该树中的所有剩余节点都是原始树的内部节点。高度为 n 的 AVL 树中可能的最小节点数是 F(n+2)-1,与我们的结果相匹配。
推荐阅读
- python - 熊猫连接字符串,包括按列分组
- python - python中的字符串搜索 - 两个列表
- python - 是否可以在字典中设置 tkinter 条目的顺序?
- sql - 使用 WHERE AND 子句计算唯一记录?
- python-3.x - 保持 3d 距离的负值
- node.js - 来自流的 mailgun 附件。如何应用文件名
- javascript - 以js、html形式计算输入文本
- mysql - 我的 ClientDataSet.ApplyUpdates 没有发布到我的 MySQL 数据库表中?
- bash - bash printf 转义/引用功能背后的基本原理是什么?
- file - 如何销毁文件?