2014-01-16 116 views
2

我創建了一個遞歸函數來計算二叉樹的最大路徑。我得到的反饋是它不起作用,但根據我的測試,它提供了正確的結果。有人能幫助我嗎?在二叉樹中查找最大總和葉根路徑

private long PathSum(int row, int column, Pyramid pyramid) 
{ 
    // Base case, stop recurse when first row is reached. 
    if (row == 0) return pyramid[row, column]; 

    // Set level to the current cell and add to the end result. 
    long value = pyramid[row, column]; 

    // Continue to the next row. 
    if (row != 0) 
    { 
     // Continue to the next left level. 
     long left = pyramid[row - 1, column]; 

     // Continue to the next right level. 
     long right = pyramid[row - 1, column + 1]; 

     // Get the highest of the left and right. 
     long highest = Math.Max(left, right); 

     // Get the index of the hightest path. 
     int nextColumn = highest == left ? column : column + 1; 

     // Recurse to the next level and add results together. 
     value += GetTotal(row – 1, nextColumn, pyramid); 
    } 
    // Return result to the caller. 
    return value; 
} 
+1

詢問他們的反饋意見,他們得到了什麼,然後嘗試調試。此外,這看起來可疑c'Math.Max(左,右)'。 – luk32

+0

這看起來不像C代碼 - 更像Java或C#。這是什麼語言?什麼是金字塔? – dasblinkenlight

+0

我問,但他們不能告訴我更多。正如我所說,我測試了它,對我來說工作得很好。 – Doro

回答

3

你有你的算法一個嚴重的錯誤:你只能通過「金字塔」走一次,選擇基於下一個結果基於情況下,不看下面的節點。 爲了說明你在做什麼,考慮下面的金字塔:

 1 
    2 3 
311 6 3 

假設你從1開始,以下將被執行:

  1. 看那最大程度的發揮基本節點(2和3)。
  2. 轉到下一個節點(3)並重復。

你的算法將返回10(1 + 3 + 6),而在我的例子中,最大值爲311 + 2 + 1,因爲它不向前看。

爲了確定最佳路徑,您需要採取一項遠遠超前一步的策略。

編輯:看Euler project #18 approach更多提示。

+0

謝謝Bas,我剛剛解決了歐拉項目的第二項。所以,我必須去看18日。 – Doro

+0

嗨Bas,你能告訴我哪個是錯誤的部分? [email protected] – Doro

0

我想你所描述的不是一個二叉樹,而是一個數字金字塔,並且使用動態編程而不是樹遍歷最好解決問題。以下是動態編程的示例代碼。它沒有被編譯,我不知道C#順便說一下:

private long DP(int maxRow, Pyramid pyramid) 
{ 
    int maxColumn = maxRow; 
    Pyramid result; 
    clear_pyramid(result); 
    for (int j=0; i<maxColumn; i++) { 
     result[0, j] = pyramid[0, j]; 
    }  
    for (int i=1; i<maxRow; i++) { 
     for (int j=0; j<maxColumn-i; j++) { 
      result[i,j] = Math.max(result[i-1,j], result[i-1,j+1]) + pyramid[i,j]; 
     }  
    } 
    return result[maxRow-1, 0]; 
} 
+1

金字塔實際上是一種二叉樹。 – Servy

+0

哦,爲什麼,我想你提到的金字塔在n級有2^n個數字?如果我們在n級談論n + 1個數字的金字塔,那麼我認爲它不是一棵樹。例如,我們在0級有1個,在1級有2個3,在2級有4個5 6,那麼2和3都連接到1和5,這意味着它們之間有兩條路徑,這與定義相矛盾的樹。 – lindenrovio

+1

@justinzhang樹只是一個沒有周期的圖。事實上,一個節點是兩個不同節點的孩子並不意味着它不是一棵樹。因爲它不是一棵樹,節點必須將其祖先(或其本身)的一個作爲它的孩子,從而創建一個循環。 – Servy