algorithm - 查找二叉树中叶节点数的数学函数

标签 algorithm data-structures binary-tree

<分区>

有一棵未知深度的不平衡二叉树。具有两个子节点的节点数用 T2 表示。只有一个子节点的节点用T1表示,叶节点用L表示。如果给定 T1 = mT2 = n 节点,那么您可以定义一个数学函数 f(m, n) 来给出数字叶节点 L?

例如,在下面的树中,总的 T2 节点是 m = 3,总的 T1 节点是 n = 2 。叶节点数 L = f(m,n) = 4。你能找到一个数学函数 f(m,n) 来给出所有树的叶节点数吗?

enter image description here

最佳答案

这很简单。在 m 个内部节点的完全二叉树(即每个非叶子节点都有 2 个子节点)中,恰好有 m+1 个叶子节点。每个只有一个 child 的节点都可以删除,你仍然有一个二叉树。因此,L 中的叶节点数就是m+1。或者回答问题:f(m, n) = m + 1

举例说明“删除 T1 节点”的含义可能会有用。考虑你的例子。右边的 5 只有一个 child 。如果我们去掉5,把9直接放在2下面,叶子的数量不会改变。

如果我们对 9 做同样的事情(将 4 直接放在 2 下),我们就有了一个完整的二叉树,即是,所有非叶子节点都有 2 个 child 。

有关如何删除所有 T1 类型的节点而不更改叶节点数的图形说明,请参见图片。

enter image description here

剩下的就是证明在一棵 m 内部节点的树中,每个非叶节点恰好有 2 个子节点,叶节点的数量是 m+1:

归纳法证明。归纳假设:|L| = |T2|+1

基础:树由单个节点组成。显然,|L|=1|T2|=0,所以它成立。

步骤:考虑一棵树,其根不是叶子。根据假设,它有两个 child ,左和右。通过归纳假设: |Lleft|=|T2left| + 1|Lright| = |T2右| + 1。对于总树,我们有 |T2| = |T2左| + |T2右| + 1|L| = |左左| + |右|。因此,|L| = |T2左| + 1 + |T2右| + 1 = |T2| + 1


替代证明

该属性也可以直接证明,无需删除 T1 节点的手动参数。同样,通过归纳,归纳假设 |L| = |T2| + 1

  • Base:树是单节点,所以|L| = 1|T2| = 0
  • 步骤案例 1:树的根只有 1 个 child ,X,然后是 |L| = |LX||T2| = |T2X|,所以 |L| = |T2| + 1 通过归纳假设。
  • 步骤案例 2:这棵树有一个根,它有左右两个 child 。通过归纳假设: |Lleft|=|T2left| + 1|Lright| = |T2右| + 1。对于总树,我们有 |T2| = |T2左| + |T2右| + 1|L| = |左左| + |右|。因此,|L| = |T2左| + 1 + |T2右| + 1 = |T2| + 1

因此,|L| = |T2| + 1 或换句话说 f(m, n) = m + 1

关于algorithm - 查找二叉树中叶节点数的数学函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18238440/

相关文章:

algorithm - 运行时空复杂度修改后的归并排序

algorithm - 如何找到在 x 时间运行的最大任务?

python - 如何最有效地使用 collections.deque(popleft 与 appendleft)

algorithm - 具有 N 个内部节点的二叉树的最佳情况高度

algorithm - 分词算法

c++ - 不适合内存的随机访问容器?

algorithm - 求有多少玩家不能赢得比赛?

java - 将有序二叉树转换为双循环链表

java - 使用红黑树的字典 - 删除错误

php - 从给定的一组数字和机会生成随机数