1. 程式人生 > 其它 >2021-01-05 | 124. 二叉樹中的最大路徑和

2021-01-05 | 124. 二叉樹中的最大路徑和

技術標籤: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 };

4. 提交結果

在這裡插入圖片描述