2017-08-25 76 views
1

這就是問題所在:遞歸二叉樹最大路徑的呼叫解釋總和

給定一個二叉樹,找到最大路徑總和。

對於這個問題,路徑被定義爲從一些 起始節點到沿着父子 連接的樹中的任何節點的任何節點序列。路徑必須包含至少一個節點,並且不需要 來通過根。

例如:考慮到以下二叉樹,

1 
/\ 
2 3 

返回6.

此問題的遞歸解決方案是這樣的:

int max = Integer.MIN_VALUE; 

public int maxPathSum(TreeNode root) { 
    helper(root); 
    return max; 
} 

private int helper(TreeNode root) { 
    if (root == null) return 0; 
    int left = Math.max(helper(root.left), 0); 
    int right = Math.max(helper(root.right), 0); 
    max = Math.max(max, root.val + left + right); 
    return root.val + Math.max(left, right); 
} 

我們呼籲helper爲離開孩子,並檢查離開的孩子是否大於零。

然後我們稱helper爲正確的孩子,並檢查正確的孩子是否大於零。

然後我們檢查當前的max值與總和root.val + left + right - 這也很清楚。

但是,在回報聲明中,我們只有根值和其中一個孩子的總和。 爲什麼我們只有一個孩子在這裏,但如果他們都是積極的,他們不是兩個?

回答

1

遞歸方法不返回解決方案本身,它只返回該部分的最大值。最終的解決方案是在最大變量中計算的。

如果您檢查maxPathSum方法,它返回的最大值不是從輔助方法返回的值。

這是因爲可能的是,該解決方案不接觸根,如這裏:

 0 
    / \ 
    1  0 
/\ /\ 
    2 3 0 0 
+0

在輔助方法有一個賦值'最大= Math.max(最大值,root.val +左+右);' - 這很清楚。但爲什麼我們返回'root.val + Math.max(左,右);'?總結'root.val'的目的是什麼,這會如何影響'max'變量的值? –

+0

輔助方法返回給定子樹的最大非完整路徑。最大變量包含'已完成'路徑 - 開始並結束於給定的子樹中。因此,當輔助方法返回時,它返回一個可能的半路徑,可以從另一個分支開始與另一半結合起來,並且如果這兩個半部分的組合值大於實際最大值,那麼它將是新的最大值。 – Selindek