我想列出所有可能的二叉搜索树。我知道这个数字将是加泰罗尼亚数字。但我也想列出它们。
让我们说我将字母分配给二叉搜索树的每个位置,如下所示
然后想要列出所有可能具有N个节点的树。如果N是1,则唯一可能的树是
A
如果N为2,那么可能的树
A B
A C
如果N为3,则可能的树
A B D
A B E
A B C
A C F
A C G
如果N为4,则可能的树
A B D H
A B D I
... should be 12 more
有没有人知道列出所有树木的好算法?
答案 0 :(得分:1)
简单(天真?)方法包括递归。具有n个节点的二叉树是根,具有k<n
节点的二叉树和具有n-1-k个节点的另一个二叉树。
这是与我的方法相对应的Python代码。如果需要,您可以轻松地对输出进行排序。
def binary_trees(n, i=0):
if not n:
return [[]]
else:
ll=[]
for k in range(n):
l1 = binary_trees(k, 2*i+1)
l2 = binary_trees(n-1-k, 2*i+2)
for j in l1:
for l in l2:
ll.append([i]+j+l)
return ll
def numbers_to_letters(l):
return [chr(i+ord('A')) for i in l]
print [numbers_to_letters(l) for l in binary_trees(4)]
可以通过DP进行改进:计算大小为1,然后是2,然后是3的树...并将它们保存在内存中以便重复使用,而不是每次重新计算这些树。