[LeetCode] 124. Binary Tree Maximum Path Sum

二叉树的最大路径和。题意是给一个二叉树,节点是数字,请输出一个最大的路径和。例子,

Example 1:

Input: [1,2,3]

       1
      / \
     2   3

Output: 6

Example 2:

Input: [-10,9,20,null,null,15,7]

   -10
   / \
  9  20
    /  \
   15   7

Output: 42

注意第二个例子,节点值是会存在负数的。思路是后序遍历,因为路径和总是要包括左孩子val + 右孩子val + 当前节点val。做法跟其他后序遍历的题几乎都一样,也是创建一个全局变量记录最后的结果。helper函数里面去递归左子树和右子树的时候,记得是跟0比较谁大,因为节点值包括负数。res算的是root.val + left + right。

时间O(n)

空间O(n)

Java实现

 1 class Solution {
 2     int res;
 3 
 4     public int maxPathSum(TreeNode root) {
 5         // corner case
 6         if (root == null) {
 7             return 0;
 8         }
 9         res = Integer.MIN_VALUE;
10         helper(root);
11         return res;
12     }
13 
14     public int helper(TreeNode root) {
15         if (root == null) {
16             return 0;
17         }
18         int left = Math.max(0, helper(root.left));
19         int right = Math.max(0, helper(root.right));
20         res = Math.max(res, left + right + root.val);
21         return Math.max(left, right) + root.val;
22     }
23 }

 

JavaScript实现

 1 /**
 2  * @param {TreeNode} root
 3  * @return {number}
 4  */
 5 var maxPathSum = function (root) {
 6     let res = -Infinity;
 7     let helper = function (root) {
 8         if (root == null) return 0;
 9         let left = Math.max(0, helper(root.left));
10         let right = Math.max(0, helper(root.right));
11         // let newPath = root.val + left + right;
12         res = Math.max(root.val + left + right, res);
13         return Math.max(left, right) + root.val;
14     }
15     helper(root);
16     return res;
17 };

 

你可能感兴趣的:([LeetCode] 124. Binary Tree Maximum Path Sum)