正如在几个 SO 问题中所解释的,更抽象地在mathworld中,加泰罗尼亚数字的序列恰好对应于可以为任何给定数量的运算符生成的括号分组的数量。但是我还没有找到一种算法来生成所有这些分组。
这种二进制包围算法对应于Tamari 格,可以用多种不同的方式来描述。该算法最明显的实际用途是通过围绕二元运算符及其运算的数字的每个可能的括号来生成所有可能的表达式。这可以用来详尽地测试二叉树上的各种类型的操作。
网络搜索确实揭示了 C# 中的一个实现,但我认为我需要一段时间才能理解,因为我不知道 C# 语法。
那么,什么 python 代码会生成围绕运算符的所有可能的括号分组(因此可以与实际表达式一起使用以生成所有可能性)?2、3 和 4 的输出如下所示:
全部二叉树(2)
- (x(xx))
- ((xx)x)
全部二叉树(3)
- (((xx)x)x)
- ((x(xx))x)
- ((xx)(xx))
- (x((xx)x))
- (x(x(xx)))
全部二叉树(4)
- (x(x(x(xx))))
- (x(x((xx)x)))
- (x((xx)(xx)))
- (x((x(xx))x))
- (x(((xx)x)x))
- ((xx)(x(xx)))
- ((xx)((xx)x))
- ((x(xx))(xx))
- (((xx)x)(xx))
- ((x(x(xx)))x)
- ((x((xx)x))x)
- (((xx)(xx))x)
- (((x(xx))x)x)
- ((((xx)x)x)x)
更好的是执行以下操作的代码:
AllBinaryTrees("2+3/4")
输出:
- 2+(3/4)
- (2+3)/4