1. 程式人生 > >Binary Tree Maximum Path Sum -- LeetCode

Binary Tree Maximum Path Sum -- LeetCode

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!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));}
樹的題目大多是用遞迴方式,但是根據要求的量還是比較靈活多變的,這道題是比較有難度的,他要用返回值去維護一箇中間量,而結果值則通過引數來維護,需要一點技巧。
           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述