当前位置: 首页 > 知识库问答 >
问题:

完整和完整二叉树中的平均子代节点数

翟博雅
2023-03-14

给定一个包含n个节点的完整二叉树,一个节点的平均后代数是多少?例如,根节点有n-1个子节点,每个叶节点有0个子节点,但是考虑到所有节点,平均值是多少?

共有1个答案

梁丘成和
2023-03-14

让我们暂时改变一下您的问题:我们称之为“后代”是包括节点本身在内的后代数量。

一片叶子有1个后代,它的父母有3个后代,然后是7个,然后是15个,等等。这些数字是2^k-1,其中k是树底部的层数(叶子的k=1)。

对于K级,您的树中显然有2^K-1节点;因为您将此值称为n,所以您有n=2^K-1和K=log2(n 1)。

仍然像我以前所做的那样调用后代(参见稍后的确切问题),2^(K-1)节点(叶子)有1个后代,2^(K-2)节点有3个后代,...直到2^(K-K)=1节点的n个后代。

后代的平均数量为:

Sum(k=1,K,   2^(K-k) * (2^k-1) ) / n

根据您对后代(不包括节点本身)的定义,您必须细分1:

Sum(k=1,K,   2^(K-k) * (2^k-1) ) / n - 1

通过替换K,您可以得到:

Sum(k=1,log2(n+1),    (2^k-1)(n+1) / 2^k ) / n - 1

使用程序Pari GP,我键入:

f(n)=sum(k=1,round(log(n+1)/log(2)),  (2^k-1)*(n+1) / 2^k ) / n - 1

我得到:

f(1)=0
f(3)=2/3
f(7)=10/7
f(15)=34/15

这看起来像A036799(n)/n。如果序列实际上是相同的(我没有仔细检查),您可以编写更简单的表达式(没有求和):

f(n)= ((log(n+1)/log(2)-2)*(n+1)+2)/n
 类似资料:
  • 我将完整子树定义为所有级别都已满且最后一个级别左对齐的树,即所有节点都尽可能左对齐,我希望找到树中最大的完整子树。 一种方法是对每个节点作为根执行这里概述的方法,这将花费O(n^2)时间。 有更好的方法吗?

  • 考虑二叉树,其中每个节点要么是叶,要么正好有两个子节点(左和右,我们认为不同)。在节点上有多少不同的树 例如: -3个节点-

  • 问题内容: 我对二叉树有一些疑问: Wikipedia指出,当“完整的二叉树是其中所有级别(可能除了最后一个级别)均已完全填充且所有节点都位于最左侧”的二叉树时,该二叉树即已 完成 。最后的“越远越好”的段落是什么意思? 如果(1)它是空的,或者(2)它的左右子级是平衡的,并且左树的高度在以下高度的1之内,则格式正确的二叉树被称为“高度平衡”。正确的树,取自如何确定二叉树是否平衡?,这是正确的还是

  • 下面给出了二叉树的实现。 如图中所示,树不是完整的二叉树。如何编写一个函数,将上述二叉树转换为完整的二叉树,只需将字符串数据节点添加到没有子节点的节点,即可生成完整的二叉树。 我将手动在代码中添加节点,以获得如下结果树: 但是,如何编写一个函数,它将采取根节点和返回树,这是完整的二叉树。

  • 如何检查由数组表示的给定完整二叉树是否是值平衡二叉树?我所说的值平衡是指,如果对于每个节点,左手边节点的整数值之和等于右手边的值之和。什么是类C算法?找出有孩子的节点的索引很容易。但是我无法开发递归计算每个节点总和的逻辑。还需要以这样一种方式计算总和,即特定节点下方左子树的所有节点的总和将等于它的右手对应物,并以类似的方式向下挖掘。怎么可能使用数组?

  • 问题内容: 我正在尝试使用链接列表而不是arraylist创建一个完整的二叉树,而不比较节点值。我的意思是插入一个新值,我不希望比较该值是否小于,大于或等于根的值,以便将其添加到左侧链接或右侧链接,但仍然能够创建一个完整的二叉树。 您认为有可能吗?如果是,您有任何想法吗?或者您可以指出我可以使用/阅读的内容吗? 编辑: 解: 问题答案: 记录一下树中有多少个项目。 然后,要添加第一项,请遵循以下步