1. 程式人生 > 其它 >[Leetcode]29.二叉樹中的最大路徑和

[Leetcode]29.二叉樹中的最大路徑和

題目:路徑被定義為一條從樹中任意節點出發,沿父節點-子節點連線,達到任意節點的序列。同一個節點在一條路徑序列中 至多出現一次 。該路徑 至少包含一個 節點,且不一定經過根節點。
路徑和 是路徑中各節點值的總和。
給你一個二叉樹的根節點 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