2021-01-05 | 124. 二叉樹中的最大路徑和
阿新 • • 發佈:2021-01-06
技術標籤:2021 LeetCode每日一題二叉樹演算法資料結構leetcodeJavaScript
1. 題目描述
給定一個非空二叉樹,返回其最大路徑和。
本題中,路徑被定義為一條從樹中任意節點出發,沿父節點-子節點連線,達到任意節點的序列。該路徑至少包含一個節點,且不一定經過根節點。
示例 1:
輸入:[1,2,3]
1
/ \
2 3
輸出:6
示例 2:
輸入:[-10,9,20,null,null,15,7]
-10
/ \
9 20
/ \
15 7
輸出:42
2. 解題思路
對於這道題目,我們可以使用遞迴遍歷
需要注意:
- 一條從父節點延伸下來的路徑,只能進入左子樹或者右子樹,不能同時進入左右子樹。
- 只有在最大貢獻值大於 0 時,才會選取對應子節點。
複雜度分析:
- **時間複雜度:**O(N),其中 N 是二叉樹中的節點個數。對每個節點訪問不超過 2 次。
- **空間複雜度:**O(N),其中 N 是二叉樹中的節點個數。空間複雜度主要取決於遞迴呼叫層數,最大層數等於二叉樹的高度,最壞情況下,二叉樹的高度等於二叉樹中的節點個數。
3. 程式碼實現
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
var maxPathSum = function(root) {
let sum = Number.MIN_SAFE_INTEGER
const dfs = (root) => {
if(!root){
return 0
}
// 計算左右子樹的最大路徑和
const left = dfs(root.left)
const right = dfs(root.right)
// 計算總的最大路徑和
const maxSum = left + root.val + right
sum = Math.max(sum, maxSum)
// 返回當前計算出的最大路徑
const max = root.val + Math.max(left, right)
return max < 0 ? 0 : max
}
dfs(root)
return sum
};