[Leetcode]29.二叉樹中的最大路徑和
阿新 • • 發佈:2021-11-18
題目:路徑被定義為一條從樹中任意節點出發,沿父節點-子節點連線,達到任意節點的序列。同一個節點在一條路徑序列中 至多出現一次 。該路徑 至少包含一個 節點,且不一定經過根節點。
路徑和 是路徑中各節點值的總和。
給你一個二叉樹的根節點 root ,返回其 最大路徑和 。
示例 1:
輸入:root = [1,2,3]
輸出:6
解釋:最優路徑是 2 -> 1 -> 3 ,路徑和為 2 + 1 + 3 = 6
示例 2:
輸入:root = [-10,9,20,null,null,15,7]
輸出:42
解釋:最優路徑是 15 -> 20 -> 7 ,路徑和為 15 + 20 + 7 = 42
思想:
後序遍歷,我們把問題分成兩種情況
情況一:路徑包括當前結點(父節點)
我們需要將左右子樹的路徑資訊傳回,返回的值是子樹中最大的那一邊加上父節點的和,注意如果出現負值則捨棄不加入。
返回一邊的原因是,路徑不能走回頭路。
情況二:路徑不包括當前結點(父節點)
我們只需要返回左右子樹的最大路徑即可。
func maxPathSum(root *TreeNode) int { var max int = 0 var dfs func(root *TreeNode) int dfs = func(root *TreeNode) int { if root == nil{ return 0 } left := dfs(root.Left) right := dfs(root.Right) curmax := root.Val+left+right //情況二,我們先計運算元樹的路徑大小,curmax if curmax>max{ max = curmax //如果比目前最大的還要大,則取而代之 } var outmax int //情況一,如果考慮父結點,我們計算出能給父結點提供最大路徑的那一邊outmax,不同時使用兩邊是為了不重複路徑 if left>right{ outmax = root.Val+left }else{ outmax = root.Val+right } if outmax>0 { return outmax //如果是正值,則返回給父結點,等父結點呼叫更新max } return 0 //如果左右子樹都提供負值,都捨棄返回父結點一個0值 } dfs(root) return max }
題目來源:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum