这个问题是几年前here提出的,但是没有给出正确的答案。
我知道,如果树的左子树和右子树的高度相差不超过一个,则树是AVL平衡的。
给定一定数量的节点(我们称其为n),其中一定数量的节点(例如x)为树叶,那么有多少个不同的AVL平衡树形具有n个节点和x个树叶?
例如there are two tree shapes for 5 nodes and 3 leaves。
我试图在我的函数num_trees_w_height
中用python实现对this question的可接受答案,然后将其用于计算num_trees
中任何高度的树木总数。到目前为止,这是我的代码:
def num_trees_w_height(height, nodes, leaves):
if nodes == 0 or leaves == 0:
return 0
if height > math.log(nodes,2) or leaves > nodes//2+1:
return 0
if height == 0:
return 1
for h in range(0,height+1):
for n in range(0,nodes+1):
return num_trees_w_height(h-1,n,l)\
*num_trees_w_height(h-1,nodes-n,leaves-l)\
+num_trees_w_height(h-1,n,l)\
*num_trees_w_height(h-2,nodes-n,leaves-l)\
+num_trees_w_height(h-2,n,l)\
*num_trees_w_height(h-1,nodes-n,leaves-l)
def num_trees(nodes, leaves):
num=0
for height in range(0,nodes):
num += num_trees_w_height(height,nodes,leaves)
return num
但是,当我调用num_trees(5,3)
时,我收到一个TypeError信息,说我的递归return语句正在尝试将int
和NoneType
乘以,而当我调用num_trees_w_height(3,5,3)
时,得到0。这两个调用都应返回2,如上面的示例所示。