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
- 這也很清楚。
但是,在回報聲明中,我們只有根值和其中一個孩子的總和。 爲什麼我們只有一個孩子在這裏,但如果他們都是積極的,他們不是兩個?
在輔助方法有一個賦值'最大= Math.max(最大值,root.val +左+右);' - 這很清楚。但爲什麼我們返回'root.val + Math.max(左,右);'?總結'root.val'的目的是什麼,這會如何影響'max'變量的值? –
輔助方法返回給定子樹的最大非完整路徑。最大變量包含'已完成'路徑 - 開始並結束於給定的子樹中。因此,當輔助方法返回時,它返回一個可能的半路徑,可以從另一個分支開始與另一半結合起來,並且如果這兩個半部分的組合值大於實際最大值,那麼它將是新的最大值。 – Selindek