【发布时间】:2014-12-12 05:34:51
【问题描述】:
我正在尝试查找定义如下的树中的最大节点数:
根最多可以有 2 个孩子。 左边的每个子树最多可以有 L 个孩子。 右边的每个子树最多可以有 R 个子树。
我知道在二叉树中查找节点数的公式是 2^h-1,其中 h 是树中的层数。
用外行的话来说,这将如何处理? (我不是很数学。)
【问题讨论】:
标签: c++ tree binary-tree binary-search-tree
我正在尝试查找定义如下的树中的最大节点数:
根最多可以有 2 个孩子。 左边的每个子树最多可以有 L 个孩子。 右边的每个子树最多可以有 R 个子树。
我知道在二叉树中查找节点数的公式是 2^h-1,其中 h 是树中的层数。
用外行的话来说,这将如何处理? (我不是很数学。)
【问题讨论】:
标签: c++ tree binary-tree binary-search-tree
所以更正式地说,你试图找到二叉搜索树中的节点数,使得树的根有两个孩子,左边的每个子树最多有 l 个孩子,右边的每个子树都有r 孩子。
我们可以分别考虑左右树,因为它们不会影响彼此的高度。不考虑根,我们将根的左子树称为L,将根的右子树称为R。 L 持有 L 中的每个节点不能有超过 l 个子节点的不变量。类似地,R 中的每个节点不能有超过 r 个子节点。
让我们构造两个函数,b和c,它们取高度h并输出L 或 R 分别。
b(h) = if h = 1 then 1 else l * b(h - 1)
c(h) = if h = 1 then 1 else r * b(h - 1)
现在,我们可以构造函数 a,它采用高度 h 并输出您定义的树的最大节点。
a(h) = if h = 1 then 1 else (b(h - 1) + c(h - 1))
现在,我们要为 a 找到一个封闭的形式。让我们从寻找 b 和 c 的封闭形式开始。
给定正高度h,因为除了第一种情况,l 被重复相乘,
b(h) = l^(h - 1)
c(h) = r^(h - 1)
a(h) = if h = 1 then 1 else (l^(h - 1) + r^(h - 1))
我不确定您是否还想在 a 的封闭形式中考虑 h = 1,但给定 h > 1 ,求你定义的二叉搜索树的最大节点数的公式是
l^(h - 1) + r^(h - 1)
【讨论】: