证明具有 n 个叶子的二叉树的高度至少为 log n

2024-01-30

我已经能够创建一个证明,显示树中的最大总节点数等于 n = 2^(h+1) - 1 并且从逻辑上我知道二叉树的高度是 log n (可以绘制它出来看看)但我很难构建一个正式的证明来证明一棵有 n 片叶子的树“至少”有 log n 。我遇到或能够组合在一起的每个证明都涉及完美的二叉树,但我需要适合任何情况的东西。有什么建议可以引导我走向正确的方向吗?


Lemma:一棵树高度的叶子数量h不超过2^h.

证明:证明是通过归纳法h.

基本情况:对于h = 0,树仅由单个根节点组成,该根节点也是叶子;这里,n = 1 = 2^0 = 2^h, 按要求。

归纳假设:假设所有树的高度k或更少 少于2^k树叶。

归纳步骤:我们必须证明树的高度k+1不超过2^(k+1)树叶。考虑根的左子树和右子树。这些树的高度不超过k,比整棵树的高度小一。因此,每个人最多有2^k叶,根据归纳假设。由于叶子总数只是根的子树的叶子数量之和,因此我们有n = 2^k + 2^k = 2^(k+1), 按要求。这证明了这一说法。

Theorem:二叉树n叶子至少有高度log(n).

我们已经在引理中注意到,仅由根节点组成的树有一个叶子且高度为零,因此在这种情况下该声明是正确的。对于具有更多节点的树,可以通过反证法来证明。

Let n = 2^a + b where 0 < b <= 2^a。现在,假设树的高度小于a + 1,与我们想要证明的定理相反。那么高度最多为a。根据引理,一棵树的最大叶子数a is 2^a。但我们的树有n = 2^a + b > 2^a离开,因为0 < b;矛盾。因此,假设高度小于a+1一定是不正确的。这证明了这一说法。

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

证明具有 n 个叶子的二叉树的高度至少为 log n 的相关文章

  • Coq - 在不丢失信息的情况下归纳函数

    当尝试对函数的结果 返回归纳类型 执行案例分析时 我在 Coq 中遇到了一些麻烦 当使用通常的策略时 比如elim induction destroy等等 信息就会丢失 我举个例子 我们首先有一个像这样的函数 Definition f n
  • 我应该为范围最小查询使用什么使用 O(n) 存储和 O(log n) 查询时间的数据结构?

    我被算法课的以下作业问题难住了 Suppose that we are given a sequence of n values x1 x2 xn and seek to quickly answer repeated queries of
  • C++ 查找单词中的 Anagrams

    我正在开发一个程序 该程序使用以下命令来检查特定单词是否是字谜词std count但是 我认为我的功能逻辑不正确 而且我似乎无法弄清楚 假设文件中有以下单词 Evil Vile Veil Live 我的代码如下 include
  • 使用 Java 和递归进行二叉树的级别顺序遍历

    我在使用递归时遇到二叉树的级别顺序遍历问题 我输入以下值 50 60 70 30 20 10 这是我正在使用的代码 public void levelOrder Node localRoot if localRoot null if loc
  • 从不平衡二叉树中随机选择一个节点

    我的一位朋友遇到了以下面试问题 我们都不太确定正确答案是什么 有谁知道如何解决这个问题 给定一个不平衡二叉树 描述一种随机选择节点的算法 使得每个节点被选择的概率相等 您只需遍历树一次即可完成此操作 该算法与列表相同 当您看到树中的第一个项
  • 尝试在本地环境中调试 LeetCode 答案时出错

    我正在研究 LeetCode 问题199 二叉树右侧视图 https leetcode com problems binary tree right side view 给定二叉树的根 想象自己站在它的右侧 返回您可以看到从上到下排序的节点
  • 伪代码归纳证明

    我不太明白如何在伪代码上使用归纳证明 它的工作方式似乎与在数学方程上使用它的方式不同 我正在尝试计算数组中可被 k 整除的整数的数量 Algorithm divisibleByK a k Input array a of n size nu
  • Unity3D 中 Update() 循环方法内的执行顺序

    我正在尝试找到合适的词语来描述我遇到的问题 希望这能解释问题 我有两个Update 两个不同类中的方法 并且一个类中的某些功能依赖于另一个类中的数据 代码 A 依赖于代码 B 的数据 使用调试日志 我发现代码B的Update 在代码 A 之
  • 仅在悬停时显示 d3 节点文本

    我试图仅在鼠标悬停时显示节点文本 当我将鼠标悬停在节点上时 svg 圆的不透明度发生变化 但仅显示第一个节点的文本 我发现这是因为我如何使用 select 元素 但我不知道如何为我悬停的节点提取正确的文本 这是我目前所拥有的 node ap
  • 获取标签内的所有节点

    我有这样的代码 div Lorem ipsum dolor sit amet p This is a paragraph p br span This is a span span Lorem ipsum dolor sit amet di
  • 计算所有结构不同的二叉树的数量的时间复杂度是多少?

    使用此处介绍的方法 http cslibrary stanford edu 110 BinaryTrees html java http cslibrary stanford edu 110 BinaryTrees html java 12
  • 如何使用 CLI 在 Windows 操作系统中将 Node.js 6.x 更新到 8.x

    我无法在 Node js 6 x 上运行 Angular 6 CLI 它显示错误 升级最低 Node js 8 xx 以使用 Angular CLI 我尝试使用以下代码 npm install g npm windows upgrade n
  • 克隆二叉树的时间复杂度

    我想知道克隆二叉树的代码的时间复杂度是否为 O n 如果是 O n 你能解释一下为什么吗 如果没有 你能建议一种时间复杂度为 O n 的方法吗 public TreeNode cloneTree TreeNode root if root
  • 按位运算的替代方法

    设想 我说有 4 个复选框 用户可以以任意组合选择这些复选框 他们也有权不选择任何一个复选框 我必须将这 4 个选项存储到一列中 我认为最好的选择是使用二进制表示形式存储 option1 has the constant value 1 o
  • 如何使用 Fitch 系统证明 ((p ⇒ q) ⇒ p) ⇒ p

    仅供参考 我使用的逻辑程序无法进行矛盾引入 这一点很可能是无关紧要的 因为我非常怀疑我是否需要使用任何形式的矛盾来证明这一点 在尝试解决这个问题时 我首先假设 p q p 它是否正确 如果是这样 接下来怎么办 如果解决方案看起来如此明显 请
  • 如何非递归地获取二叉树中叶节点的数量?

    我有一个练习问题被难住了 在不使用递归的情况下获取二叉树中叶节点的数量 我已经四处寻找一些想法 我已经看到了一些想法 例如将节点传递到堆栈 但我不知道当有多个分支时如何做到这一点 任何人都可以提供指针吗 NumberOfLeafNodes
  • jQuery - 如何将多个节点附加到容器

    我需要将多个节点附加到容器中 我不想在每次迭代中执行缓慢的 DOM 追加 而是想将文档片段中的节点排队 对其他想法开放 并一次将它们全部追加 这是我的代码 var fragment document createDocumentFragme
  • 可能的数独谜题的数量[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Wiki http en wikipedia org wiki Mathematics of Sudoku http en wikiped
  • 如何在 O(n) 时间内遍历二叉树而不需要额外的内存

    给定一棵带有整数 左指针和右指针的二叉树 如何在 O n 时间和 O 1 额外内存 无堆栈 队列 递归 内遍历该树 This guy http nandacumar blogspot com 2006 06 traversing tree
  • php简单xml如何读取具有不同子节点级别的多个节点

    我有一个 xml 文件 其中包含不同的命名节点和多级子节点 每个节点之间都不同 我应该如何访问数据 需要很多嵌套的for循环吗 以下是 xml 代码示例

随机推荐