Eric Lippert の関連する投稿がここにあります(実際には、一連の投稿の始まりです)。重要なのは、この再帰的な LINQ メソッドです。
static IEnumerable<Node> AllBinaryTrees(int size)
{
if (size == 0)
return new Node[] { null };
return from i in Enumerable.Range(0, size)
from left in AllBinaryTrees(i)
from right in AllBinaryTrees(size - 1 - i)
select new Node(left, right);
}
これは、指定されたサイズのすべての可能な二分木構造を取得します。
(a)ノードのリストのすべての順列、および(b)すべてのツリー構造のエリックのリストを取得し、2つの「交差積」を実行すると(順列したノードを一定の順序で左から右に構造化する必要があります)、必要なすべてのツリーを取得する必要があります。
例: 3 項目の場合
Permutations Tree structures
123 132 . . . . .
213 231 ./ ./ ./ \. \. \.
312 321 ./ \. ./ \.
Result
: 1 1 1 1 1 1 1 1 1 1
: 2/ 2/ 2/ \3 \2 \2 3/ 3/ 3/ \2 \3 \3
: 3/ \3 3/ \3 2/ \2 2/ \2
: 2 2 2 2 2 2 2 2 2 2
: 1/ 1/ 1/ \3 \1 \1 3/ 3/ 3/ \1 \3 \3
: 3/ \3 3/ \3 1/ \1 1/ \1
: 3 3 3 3 3 3 3 3 3 3
: 1/ 1/ 1/ \2 \1 \1 2/ 2/ 2/ \1 \2 \2
: 2/ \2 2/ \2 1/ \1 1/ \1
キラリティを気にしないと、これは難しくなります。
(入力ノードの順列を生成し、Eric の構造の 1 つに順列を割り当てることは、かなり簡単なはずです...そうですか?)