1. 程式人生 > 其它 >leetcode hot 100-124. 二叉樹中的最大路徑和

leetcode hot 100-124. 二叉樹中的最大路徑和

技術標籤:二叉樹演算法資料結構leetcodejava

124. 二叉樹中的最大路徑和

題目描述

給定一個非空二叉樹,返回其最大路徑和。

本題中,路徑被定義為一條從樹中任意節點出發,沿父節點-子節點連線,達到任意節點的序列。該路徑至少包含一個節點,且不一定經過根節點。

示例 1:

示例2:

思路:遞迴

思路參考:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/solution/er-cha-shu-zhong-de-zui-da-lu-jing-he-by-ikaruga/

每棵子樹的最大路徑等於根節點加上左右子樹的最大路徑,如果左右子樹的最大路徑小於0, 則加上0, 而非加上左右子樹。因為如果左右子樹最大值小於0的話,加上他們也是一個拖累,所以如果小於0, 則不加他們,而是加上0。如果左右子樹最大路徑均小於0, 則當前子樹的最大路徑就是根節點的值,所以單個結點為最大路徑的情況在每個結點為根節點時就應經考慮到了。

但是返回值只能返回子樹的半邊或者只返回根節點

 1 class Solution {
 2 
 3     public int maxSum = -1 << 30;
 4     public int inOrder(TreeNode root){
 5         if(root == null){
 6             return 0;
 7         }
 8         int leftMaxSum = inOrder(root.left);
 9         int rightMaxSum = inOrder(root.right);
10        
11         // 最大值在根節點加上左右根節點
12         int sum = root.val + Math.max(leftMaxSum, 0) + Math.max(rightMaxSum, 0);    
13         int ret = root.val + Math.max(Math.max(leftMaxSum, rightMaxSum), 0);
14         maxSum  = Math.max(sum, maxSum);
15         return ret;     // 只返回該子樹半邊或者只返回根節點
16     }
17 
18     public int maxPathSum(TreeNode root) {
19 
20         // 左右根中序遞迴遍歷
21         inOrder(root);
22         // 維護一個最大值,返回子樹根節點的值加上0或者左右子樹的最大值
23         return maxSum;
24     }
25 }

leetcode執行用時:1 ms > 99.78%, 記憶體消耗:40 MB > 98.55%

複雜度分析:

時間複雜度:O(n)。遍歷了所有的結點,所以時間複雜度為O(n)。

空間複雜度:O(n)。空間複雜度取決於遞迴棧的深度,遞迴棧的深度取決於樹的高度,樹的高度最大為 n, 即退化成連結串列時,所以空間複雜度為最差為O(n)。