Binary Tree Maximum Path Sum -- LeetCode
阿新 • • 發佈:2018-11-16
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
原題連結: http://oj.leetcode.com/problems/binary-tree-maximum-path-sum/這道題是求樹的路徑和的題目,不過和平常不同的是這裡的路徑不僅可以從根到某一個結點,而且路徑可以從左子樹某一個結點,然後到達右子樹的結點,就像題目中所說的可以起始和終結於任何結點。在這裡樹沒有被看成有向圖,而是被當成無向圖來尋找路徑。因為這個路徑的靈活性,我們需要對遞迴返回值進行一些調整,而不是通常的返回要求的結果。在這裡,函式的返回值定義為以自己為根的一條從根到子結點的最長路徑(這裡路徑就不是當成無向圖了,必須往單方向走)。這個返回值是為了提供給它的父結點計算自身的最長路徑用,而結點自身的最長路徑(也就是可以從左到右那種)則只需計算然後更新即可。這樣一來,一個結點自身的最長路徑就是它的左子樹返回值(如果大於0的話),加上右子樹的返回值(如果大於0的話),再加上自己的值。而返回值則是自己的值加上左子樹返回值,右子樹返回值或者0(注意這裡是“或者”,而不是“加上”,因為返回值只取一支的路徑和)。在過程中求得當前最長路徑時比較一下是不是目前最長的,如果是則更新。演算法的本質還是一次樹的遍歷,所以複雜度是O(n)。而空間上仍然是棧大小O(logn)。程式碼如下:
public int maxPathSum(TreeNode root) { if(root==null) return 0; ArrayList<Integer> res = new ArrayList<Integer>(); res.add(Integer.MIN_VALUE); helper(root,res); return res.get(0);}private int helper(TreeNode root, ArrayList<Integer> res){ if(root == null) return 0; int left = helper(root.left, res); int right = helper(root.right, res); int cur = root.val + (left>0 ?left:0)+(right>0?right:0); if(cur>res.get(0)) res.set(0,cur); return root.val+Math.max(left, Math.max(right,0));}
樹的題目大多是用遞迴方式,但是根據要求的量還是比較靈活多變的,這道題是比較有難度的,他要用返回值去維護一箇中間量,而結果值則通過引數來維護,需要一點技巧。