澄清埃裏克利珀有一個相關的職位here(系列文章的真正開始)。關鍵位是這個遞歸方法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)Eric的所有樹結構列表,並且執行這兩個節點的「交叉乘積」(將你的置換節點賦值給結構
中的節點以一致的順序從左到右
),您應該獲得所需的所有樹。
E.g. 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的結構之一分配排列,應該是相當瑣碎的,對吧?)
通過「獨特的排列」,你的意思是結構呢?例如,將具有左子節點2(其具有另一個左子節點3)的根1的樹視爲與具有左子節點2和右子節點3的樹相同?對不起,如果我措辭有點笨拙的問題.. – Daniel 2012-07-12 10:41:32
它不會被認爲是一樣的。 – user978122 2012-07-13 20:16:32