给定数字n和k,有多少个具有k个叶子的平衡(高度平衡)二叉树?

时间:2018-10-21 14:29:38

标签: algorithm

我们有n个节点和k个数,我们如何计算(例如,通过动态编程)具有n个节点和k个叶子的所有高度平衡树?

(高度平衡的二叉树是最大叶高差为1的树。)

1 个答案:

答案 0 :(得分:1)

关于这些树的假设/定义:

  • n 个“节点”;每个人都没有孩子,只有一个左孩子,只有一个右孩子,或者既有左孩子又有右孩子。
  • k 个“叶子”,表示没有子节点。
  • 如果树的高度称为 h ,则子节点少于两个的节点的深度都等于 h h –1。 (这是平衡要求。)
  • 一棵树完全由其结构定义(节点没有子节点vs.左子节点vs.右子节点vs.左右子节点)。

鉴于上述情况,该树由高度为 h –1 的一个完整的二叉树组成,该树的底层为一个或多个叶节点。叶子的总数等于我们添加的叶子的数量,加上上一级中未添加任何子代的节点的数量。

因此,在较高层次上,算法如下:

  • 计算底层有多少个节点,以及底层有多少个节点。 (这仅取决于 n ;例如,高度为6的完整二叉树具有2 6 + 1 –1 = 127个节点,因此如果 n = 130,则底层有3个节点,从下至下有64个节点。
  • 计算从下到下的第二层有多少个节点没有子节点(这是 k 减去最底层的节点数),其余的有一个子节点vs 。两个孩子(使用以前获得的结果)。
  • 然后可以通过组合法确定可能的树总数。具体来说,它是这三个值的乘积:
    • 从第二行到第二行的节点中选择没有子节点的方法的数量:(第二行至第二层的节点)nCr(第二行至第二层的节点)没有孩子)
    • 从第二行到第二行的其余节点中选择有一个子节点的方式的数量:(第二到第二级有一个或两个子节点的节点)nCr(第二个节点中的节点一个孩子从头到尾的水平
    • 从第二行到第二行带有一个孩子的节点中选择哪个节点是左子节点,哪些节点是一个右子节点:2 (第二个节点中的节点底到一个孩子的水平)

在执行此操作时,请务必考虑到没有 n k 值的树的可能性;对于任何给定的 n ,对于满足上述约束的树,实际上只有 k 值的某个范围是可能的。如果 k 超出该范围,则实现需要返回0。