关于这些树的假设/定义:
- 有 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。