2012-07-09 19 views
3

給定數量的二叉樹節點(X)寫入方法,返回X節點的二叉樹隨機排列的數量。如何查找可能的二叉樹拓撲排列的數量?

實例:

X = 1:1

 o 

X = 2:2

 o o 
    o  o 

X = 3:5

 o o   o  o  o 
     o  o  o   o o o 
    o   o  o  o 

我結束了:

public static int numOfPerms(int numOfNodes) { 
     if (numOfNodes<=2 && numOfNodes > 0) { 
      return numOfNodes; 
     } 
     int res = 1; 
     for (int i=1; i<=numOfNodes; i++) { 
      res = res*(4*i-1)/(i+1); 
     } 
     return res; 
    } 

我希望在這裏分享更好的解決方案。

+0

你說「置換」,但確實在樹此事的每個節點的位置? – 2012-07-09 14:55:53

+0

@Colin D,它確實 - 它是概率分佈 – aviad 2012-07-09 14:57:50

+0

所以節點編號,例如x = 2的情況下,我們有兩個簡單的樹:1-> 2,2-> 1? – 2012-07-09 14:59:04

回答

2

試試這個遞歸方法:

static int numOfPerms(int numOfNodes) { 
    if (numOfNodes == 1) { 
     return 1; 
    } 

    numOfNodes = numOfNodes - 1; 
    return ((numOfPerms(numOfNodes) * (2*numOfNodes+2) * 
      (2*numOfNodes+1))/((numOfNodes+1)*(numOfNodes+2))); 
} 
4

好吧,據我所知,你的解決方案是不正確的,對吧? (對於numOfNodes=4它返回12而不是14)

直覺上,我會去遞歸方法。

  1. 使用了一個節點作爲父節點
  2. 所有可能劃分爲兩組,遞歸調用函數的兩套
  3. 從兩組各部門的相乘的結果,並總結出的產品所有部門
  4. 返回總和

但是實現它之前,我會確保有對此並沒有簡單的公式。我沒有在快速找到一個(這並不意味着沒有一個)。

編輯:如已在另一個答案中所述:你也可以只計算第n個加泰羅尼亞號碼。

+0

[整數序列的在線百科全書](http://oeis.org/)在嘗試將序列轉換爲公式時總是一個很好的起點。 – MvG 2012-07-09 15:16:20

+0

你能幫我弄清楚爲什麼'numOfNodes = 4'答案應該是14而不是12?我這樣計算:從最低的葉子(讓我們假設他們在樹的第4級)到第3級的葉子到第2級的葉子的根(第1級)'+4'方式'8'種方式。我不計算從lvl 2到lvl 3的方法,因爲它們與lvl 3到lvl 2是一樣的。所以它給了我12 ...我錯過了什麼? – Pshemo 2012-07-09 15:46:55

+0

@Pshemo in [this PDF](http://www.stringology.org/event/2009/psc09p17_presentation.pdf)由上面的Colin D鏈接,您可以在第6頁找到4個節點的所有排列。 – brimborium 2012-07-09 15:56:18

5

我認爲Catalan Numbers可以計算你的樹木(參見關於applications in combinatorics的部分)。它們形成通常由該遞推關係定義一個衆所周知的序列:

recurrence relation for C_n

這種復發經常出現在約樹或遞歸結構的計數問題,所以這是相當充分的研究。維基百科條目我連接給出了一些用於第n個Catalan數有用封閉形式的表達式,即

closed formulae

所有的人都適合於代碼實現,並且比任何遞歸方法快得多。

+0

是的,[加泰羅尼亞數字](http://oeis.org/A000108)匹配我自己的遞歸:'f(0)= 1; f(x)= sum(f(y)* f(x-y-1),y = 0 ...(x-1))'。 – MvG 2012-07-09 15:14:43

+0

你應該發佈一些關於加泰羅尼亞數字的實際信息,併爲他們發佈forumla。根據常見問題,鏈接只有答案是皺眉。 – 2012-07-09 15:18:25