Python 生成所有n叶任意树

Python 生成所有n叶任意树,python,tree,binary-tree,Python,Tree,Binary Tree,我需要为给定数量的叶节点生成所有可能的任意树拓扑,限制是每个非叶、非根节点必须有一个兄弟节点(以防止无限递归)。特别是,我正在寻找一种干净的Pythonic方法来实现这一点(尽管欢迎任何和所有的建议) 例如,对于n=3,我要寻找以下输出: (1 2 3) ((1)2 3) (1(2)3) (1 2(3)) ((1)(2)3) ((1)2(3)) (1(2)(3)) ((1)(2)(3)) ((1 2)3) ((1)2)3) 特别是,(1)是n=1的有效树,但((1))不是,因为它包含一个没

我需要为给定数量的叶节点生成所有可能的任意树拓扑,限制是每个非叶、非根节点必须有一个兄弟节点(以防止无限递归)。特别是,我正在寻找一种干净的Pythonic方法来实现这一点(尽管欢迎任何和所有的建议)

例如,对于n=3,我要寻找以下输出:

  • (1 2 3)
  • ((1)2 3)
  • (1(2)3)
  • (1 2(3))
  • ((1)(2)3)
  • ((1)2(3))
  • (1(2)(3))
  • ((1)(2)(3))
  • ((1 2)3)
  • ((1)2)3)
特别是,(1)是n=1的有效树,但((1))不是,因为它包含一个没有同级的内部节点。这使可能的树集保持有限

(我对排序不可知:解决方案可能会将(12)和(21)视为相同或不同。也就是说,我最终需要将它们区分开来,但这很容易在第二步中完成。)

相关背景 二叉树和任意树之间定义了同态,因此具有k个节点的二叉树与具有k+1个节点的任意树一样多。看见Lippert提供了一种简单的方法来为给定数量的节点生成所有任意树,但我正在寻找具有给定数量的叶子和可变数量的节点的所有任意树

Python中有一个枚举n叶二叉树的方法。但相应的任意树的叶数将少于n:我对叶节点的约束是对任意树的约束,而不是对其二进制表示的约束


将任意树转换为二叉树时,任意树中的叶对应于二叉树中没有剩余子节点的节点。因此,解决方案似乎可以从一组叶节点(定义为只有右分支)和内部节点(至少需要左分支)开始,并枚举可能的组合。但是,我不太清楚如何找到完整的解决方案。

我没有找到一种明显的方法来枚举这些树。我相信这个问题可以解决,如果你也能解决“有多少种方法可以在n的字符串中插入m对匹配的括号,这样就没有匹配的括号直接插入到另一个括号中”;也许会有帮助。谢谢你看这个,埃里克!我已经看了一点插入匹配的paren,但是我会再考虑一下,如果我有什么想法,我会更新这个问题。