如何列出按加泰罗尼亚语关系排序的所有二叉树

时间:2015-08-07 09:50:30

标签: algorithm common-lisp binary-tree pseudocode catalan

我正在寻找Lisp或伪代码中的算法来列出按加泰罗尼亚语关系排序的所有二叉树。

例如,我希望输入'(a b c d)获得此结果:(a (b (c d))) (a ((b c) d)) ((a b) (c d)) ((a (b c)) d) (((a b) c) d)

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

加泰罗尼亚语数字没有定义二进制树的任何特定顺序。最常见的排序是通过降低叶片深度的词典排序(因此,左重树在平衡树之前排序,在右重树之前排序)。

要获得此排序,您可以对具有n个叶子的树使用递归算法,对于所有a+b=n, a>=1, b>=1,按a的降序返回所有由一些左子项组成的树留下a个叶子和一些带有b叶子的右孩子。也就是说,你双方递归,并输出笛卡尔积。

一些伪代码:

def gen_trees(a,b):
    left_trees = gen_all_trees(a)
    right_trees = gen_all_trees(b)

    trees = []
    for l in left_trees:
        for r in right_trees:
            trees.append([l,r])
    return trees

def gen_all_trees(items):
    trees = []
    if len(items) == 1:
        trees += [items[0]]
    else:
        for i in range(len(items)-1, 0,-1):
            a = items[:i]
            b = items[i:]
            trees += gen_trees(a,b)
    return trees