如何列出所有可能包含n个节点的二叉搜索树?

时间:2014-06-06 07:25:41

标签: c algorithm catalan

我想列出所有可能的二叉搜索树。我知道这个数字将是加泰罗尼亚数字。但我也想列出它们。

让我们说我将字母分配给二叉搜索树的每个位置,如下所示

enter image description here

然后想要列出所有可能具有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

有没有人知道列出所有树木的好算法?

1 个答案:

答案 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的树...并将它们保存在内存中以便重复使用,而不是每次重新计算这些树。