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

Algorithm 给定一个数字n,有多少平衡二叉树(不是二叉搜索树)?,algorithm,data-structures,tree,binary-tree,binary-search-tree,Algorithm,Data Structures,Tree,Binary Tree,Binary Search Tree,在这个问题中,balanced的定义是 其左子树中的节点数及其左子树中的节点数 右子树几乎相等,这意味着它们的差异不相等 大于一 如果给定一个n作为节点总数,那么有多少这样的树 如果我们用高度替换节点数,又会怎么样?给定一个高度>代码>,有多少高度平衡树? 嗯,差异只会由最后一级来进行,因此你可以只找到那个节点应该剩下多少个节点,并且只考虑所有可能的组合。拥有n节点时,您知道高度应该是floor(log(n))因此深度k=floor(log(n))-1处的同一棵树是完全平衡的,因此您知道需要(

在这个问题中,
balanced
的定义是

其左子树中的节点数及其左子树中的节点数 右子树几乎相等,这意味着它们的差异不相等 大于一

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



如果我们用
高度
替换
节点数
,又会怎么样?给定一个<代码>高度>代码>,有多少高度平衡树?

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


对于高度故事,你考虑一个组合的代码:>代码> 2层(log(n))< /代码>选择<代码> i <代码>作为<代码> i>代码>从1到<代码> 2层(log(n))< /代码>。您考虑所有可能在最后一级有1个节点,然后2个等,直到您不使它成为一个完全平衡的二叉树,因此具有所有<代码> 2层(log(n))< /代码>插槽。尝试为具有2*N和2*N+1个节点的树的数量写下一个递归公式(也为高度为h+1的树的数量)。你可能想考虑N=2 ^ 1 K-1节点的树的数量。@ N.M.NAH,这不是家里的工作,只是自我提升。是的,我试过了,但这是两种情况的结合。我想知道是否有一个唯一的方程,我给n,得到ansdirectly@Jackson-您的所有条件似乎都与AVL树相似。你说的是AVL树吗?@arunb2w AVL树是第二个定义,高度差最多为1,而不是最初定义的节点数差最多为1。