algorithm - 给定一个数 n,有多少平衡二叉树(不是二叉搜索树)?

标签 algorithm data-structures tree binary-tree binary-search-tree

本题中balanced的定义是

The number of nodes in its left subtree and the number of nodes in its right subtree are almost equal, which means their difference is not greater than one

如果给定一个 n 作为节点的总数,那么这样的树有多少?


另外,如果我们用 height 替换 the number of nodes 会怎样?给定一个高度,有多少棵高度平衡的树?

最佳答案

好吧,差异只会由最后一层造成,因此您可以找到应该为该层保留多少节点,然后考虑所有可能的组合。有 n 个节点,你知道高度应该是 floor(log(n)) 因此同一棵树在深度 k = floor(log(n)) - 1 是完全平衡的,因此您知道它需要 (m = sum(i=0..k)2^i) 个节点,因此需要 n-m 个节点留给最后一级。平衡二叉树的一些定义强制“所有节点左对齐”,在这种情况下,很明显只有一种可能性,没有这个约束,你有 2^floor(log(n) ) 选择 n-m,因为您必须选择 2^floor(log(n)) 可能的插槽中的哪个,您将分配给节点,强制总共要分配的 n-m 个节点。

对于高度故事,您考虑 2^floor(log(n)) 的组合总和选择 i 作为 i 来自1 到 2^floor(log(n))。您考虑在最后一级有 1 个节点的所有可能性,然后是 2 等等,直到您不使它成为完全平衡的二叉树,因此所有 2^floor(log(n))分配的插槽。

关于algorithm - 给定一个数 n,有多少平衡二叉树(不是二叉搜索树)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21931886/

相关文章:

遍历图像像素的算法

python - 使用 Factoradic 系统允许重复时查找第 K 个字典排列

javascript - 迭代树序列化函数

c - 段错误:11 error while implementing Doubly Linked List Data Structure

java - Java中的简单二叉搜索树

ruby-on-rails - 在 Ruby 中对嵌套/邻接模型进行排序的算法

c - C 语言上的二叉树实现

algorithm - 解码使用霍夫曼算法编码的文本

java - 反转二叉树的交替级别

java - 在 Java 中将 Map<String, List<MyObject> 转换为 List<Map<String, MyObject>>