如何列出按加泰罗尼亚关系排序的所有二叉树
How to list all binary trees ordered by the catalan relation
我正在寻找 Lisp 或伪代码中的算法,以列出按 catalan 关系排序的所有二叉树。
例如我想输入 '(a b c d)
得到这个结果:(a (b (c d))) (a ((b c) d)) ((a b) (c d)) ((a (b c)) d) (((a b) c) d)
在此先感谢您的帮助。
加泰罗尼亚数字没有定义二叉树的任何特定顺序。最常见的排序是按叶子深度的降序字典顺序(因此,left-heavy 树排在平衡树之前,平衡树排在 right-heavy 树之前)。
要获得此顺序,您可以对具有 n
叶子的树使用递归算法,对于所有 a+b=n, a>=1, b>=1
以 a
、returns 的降序排列由一些左 child 和 a
叶子和一些右 child 和 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
我正在寻找 Lisp 或伪代码中的算法,以列出按 catalan 关系排序的所有二叉树。
例如我想输入 '(a b c d)
得到这个结果:(a (b (c d))) (a ((b c) d)) ((a b) (c d)) ((a (b c)) d) (((a b) c) d)
在此先感谢您的帮助。
加泰罗尼亚数字没有定义二叉树的任何特定顺序。最常见的排序是按叶子深度的降序字典顺序(因此,left-heavy 树排在平衡树之前,平衡树排在 right-heavy 树之前)。
要获得此顺序,您可以对具有 n
叶子的树使用递归算法,对于所有 a+b=n, a>=1, b>=1
以 a
、returns 的降序排列由一些左 child 和 a
叶子和一些右 child 和 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