题目描述 
路径  被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次  。该路径 至少包含一个  节点,且不一定经过根节点。
路径和  是路径中各节点值的总和。
给定一个二叉树的根节点 root ,返回其 最大路径和 ,即所有路径上节点值之和的最大值。
 
示例 1: 
输入: root = [1,2,3]
输出: 6
解释: 最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6 
示例 2: 
输入: root = [-10,9,20,null,null,15,7]
输出: 42
解释: 最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42
 
 
提示: 
    树中节点数目范围是 [1, 3 * 104 ] 
    -1000 <= Node.val <= 1000 
 
 
 注意:本题与主站 124 题相同: https://leetcode.cn/problems/binary-tree-maximum-path-sum/ 
解法 
方法一:递归 
我们思考二叉树递归问题的经典套路:
终止条件(何时终止递归) 
递归处理左右子树 
合并左右子树的计算结果 
 
对于本题,我们设计一个函数 \(dfs(root)\) ,它返回以 \(root\)  为根节点的二叉树的最大路径和。
函数 \(dfs(root)\)  的执行逻辑如下:
如果 \(root\)  不存在,那么 \(dfs(root)\)  返回 \(0\) ;
否则,我们递归计算 \(root\)  的左子树和右子树的最大路径和,分别记为 \(left\)  和 \(right\) 。如果 \(left\)  小于 \(0\) ,那么我们将其置为 \(0\) ,同理,如果 \(right\)  小于 \(0\) ,那么我们将其置为 \(0\) 。
然后,我们用 \(root.val + left + right\)  更新答案。最后,函数返回 \(root.val + \max(left, right)\) 。
在主函数中,我们调用 \(dfs(root)\) ,即可得到每个节点的最大路径和,其中的最大值即为答案。
时间复杂度 \(O(n)\) ,空间复杂度 \(O(n)\) 。其中 \(n\)  是二叉树的节点数。
Python3 Java C++ Go TypeScript Rust JavaScript C# Swift 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 # Definition for a binary tree node. 
# class TreeNode: 
#     def __init__(self, val=0, left=None, right=None): 
#         self.val = val 
#         self.left = left 
#         self.right = right 
class   Solution : 
    def   maxPathSum ( self ,  root :  Optional [ TreeNode ])  ->  int : 
        def   dfs ( root :  Optional [ TreeNode ])  ->  int : 
            if  root  is  None : 
                return  0 
            left  =  max ( 0 ,  dfs ( root . left )) 
            right  =  max ( 0 ,  dfs ( root . right )) 
            nonlocal  ans 
            ans  =  max ( ans ,  root . val  +  left  +  right ) 
            return  root . val  +  max ( left ,  right ) 
        ans  =  - inf 
        dfs ( root ) 
        return  ans 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 /** 
 * Definition for a binary tree node. 
 * public class TreeNode { 
 *     int val; 
 *     TreeNode left; 
 *     TreeNode right; 
 *     TreeNode() {} 
 *     TreeNode(int val) { this.val = val; } 
 *     TreeNode(int val, TreeNode left, TreeNode right) { 
 *         this.val = val; 
 *         this.left = left; 
 *         this.right = right; 
 *     } 
 * } 
 */ 
class  Solution   { 
     private   int   ans   =   - 1001 ; 
     public   int   maxPathSum ( TreeNode   root )   { 
         dfs ( root ); 
         return   ans ; 
     } 
     private   int   dfs ( TreeNode   root )   { 
         if   ( root   ==   null )   { 
             return   0 ; 
         } 
         int   left   =   Math . max ( 0 ,   dfs ( root . left )); 
         int   right   =   Math . max ( 0 ,   dfs ( root . right )); 
         ans   =   Math . max ( ans ,   root . val   +   left   +   right ); 
         return   root . val   +   Math . max ( left ,   right ); 
     } 
} 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 /** 
 * Definition for a binary tree node. 
 * struct TreeNode { 
 *     int val; 
 *     TreeNode *left; 
 *     TreeNode *right; 
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {} 
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} 
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} 
 * }; 
 */ 
class   Solution   { 
public : 
     int   maxPathSum ( TreeNode *   root )   { 
         int   ans   =   -1001 ; 
         function < int ( TreeNode * ) >   dfs   =   [ & ]( TreeNode *   root )   { 
             if   ( ! root )   { 
                 return   0 ; 
             } 
             int   left   =   max ( 0 ,   dfs ( root -> left )); 
             int   right   =   max ( 0 ,   dfs ( root -> right )); 
             ans   =   max ( ans ,   left   +   right   +   root -> val ); 
             return   root -> val   +   max ( left ,   right ); 
         }; 
         dfs ( root ); 
         return   ans ; 
     } 
}; 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 /** 
 * Definition for a binary tree node. 
 * type TreeNode struct { 
 *     Val int 
 *     Left *TreeNode 
 *     Right *TreeNode 
 * } 
 */ 
func   maxPathSum ( root   * TreeNode )   int   { 
     ans   :=   - 1001 
     var   dfs   func ( * TreeNode )   int 
     dfs   =   func ( root   * TreeNode )   int   { 
         if   root   ==   nil   { 
             return   0 
         } 
         left   :=   max ( 0 ,   dfs ( root . Left )) 
         right   :=   max ( 0 ,   dfs ( root . Right )) 
         ans   =   max ( ans ,   left + right + root . Val ) 
         return   max ( left ,   right )   +   root . Val 
     } 
     dfs ( root ) 
     return   ans 
} 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 /** 
 * Definition for a binary tree node. 
 * class TreeNode { 
 *     val: number 
 *     left: TreeNode | null 
 *     right: TreeNode | null 
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) { 
 *         this.val = (val===undefined ? 0 : val) 
 *         this.left = (left===undefined ? null : left) 
 *         this.right = (right===undefined ? null : right) 
 *     } 
 * } 
 */ 
function   maxPathSum ( root :   TreeNode   |   null ) :   number   { 
     let   ans   =   - 1001 ; 
     const   dfs   =   ( root :   TreeNode   |   null ) :   number   =>   { 
         if   ( ! root )   { 
             return   0 ; 
         } 
         const   left   =   Math . max ( 0 ,   dfs ( root . left )); 
         const   right   =   Math . max ( 0 ,   dfs ( root . right )); 
         ans   =   Math . max ( ans ,   left   +   right   +   root . val ); 
         return   Math . max ( left ,   right )   +   root . val ; 
     }; 
     dfs ( root ); 
     return   ans ; 
} 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 // Definition for a binary tree node. 
// #[derive(Debug, PartialEq, Eq)] 
// pub struct TreeNode { 
//   pub val: i32, 
//   pub left: Option<Rc<RefCell<TreeNode>>>, 
//   pub right: Option<Rc<RefCell<TreeNode>>>, 
// } 
// 
// impl TreeNode { 
//   #[inline] 
//   pub fn new(val: i32) -> Self { 
//     TreeNode { 
//       val, 
//       left: None, 
//       right: None 
//     } 
//   } 
// } 
use   std :: cell :: RefCell ; 
use   std :: rc :: Rc ; 
impl   Solution   { 
     fn   dfs ( root :   & Option < Rc < RefCell < TreeNode >>> ,   res :   & mut   i32 )   ->   i32   { 
         if   root . is_none ()   { 
             return   0 ; 
         } 
         let   node   =   root . as_ref (). unwrap (). borrow (); 
         let   left   =   ( 0 ). max ( Self :: dfs ( & node . left ,   res )); 
         let   right   =   ( 0 ). max ( Self :: dfs ( & node . right ,   res )); 
         * res   =   ( node . val   +   left   +   right ). max ( * res ); 
         node . val   +   left . max ( right ) 
     } 
     pub   fn   max_path_sum ( root :   Option < Rc < RefCell < TreeNode >>> )   ->   i32   { 
         let   mut   res   =   - 1000 ; 
         Self :: dfs ( & root ,   & mut   res ); 
         res 
     } 
} 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 /** 
 * Definition for a binary tree node. 
 * function TreeNode(val, left, right) { 
 *     this.val = (val===undefined ? 0 : val) 
 *     this.left = (left===undefined ? null : left) 
 *     this.right = (right===undefined ? null : right) 
 * } 
 */ 
/** 
 * @param {TreeNode} root 
 * @return {number} 
 */ 
var   maxPathSum   =   function   ( root )   { 
     let   ans   =   - 1001 ; 
     const   dfs   =   root   =>   { 
         if   ( ! root )   { 
             return   0 ; 
         } 
         const   left   =   Math . max ( 0 ,   dfs ( root . left )); 
         const   right   =   Math . max ( 0 ,   dfs ( root . right )); 
         ans   =   Math . max ( ans ,   left   +   right   +   root . val ); 
         return   Math . max ( left ,   right )   +   root . val ; 
     }; 
     dfs ( root ); 
     return   ans ; 
}; 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 /** 
 * Definition for a binary tree node. 
 * public class TreeNode { 
 *     public int val; 
 *     public TreeNode left; 
 *     public TreeNode right; 
 *     public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) { 
 *         this.val = val; 
 *         this.left = left; 
 *         this.right = right; 
 *     } 
 * } 
 */ 
public   class   Solution   { 
     private   int   ans   =   - 1001 ; 
     public   int   MaxPathSum ( TreeNode   root )   { 
         dfs ( root ); 
         return   ans ; 
     } 
     private   int   dfs ( TreeNode   root )   { 
         if   ( root   ==   null )   { 
             return   0 ; 
         } 
         int   left   =   Math . Max ( 0 ,   dfs ( root . left )); 
         int   right   =   Math . Max ( 0 ,   dfs ( root . right )); 
         ans   =   Math . Max ( ans ,   left   +   right   +   root . val ); 
         return   root . val   +   Math . Max ( left ,   right ); 
     } 
} 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 /* class TreeNode { 
*     var val: Int 
*     var left: TreeNode? 
*     var right: TreeNode? 
*     init() { 
*         self.val = 0 
*         self.left = nil 
*         self.right = nil 
*     } 
*     init(_ val: Int) { 
*         self.val = val 
*         self.left = nil 
*         self.right = nil 
*     } 
*     init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) { 
*         self.val = val 
*         self.left = left 
*         self.right = right 
*     } 
* } 
*/ 
class   Solution   { 
     private   var   ans   =   Int . min 
     func   maxPathSum ( _   root :   TreeNode ?)   ->   Int   { 
         _   =   dfs ( root ) 
         return   ans 
     } 
     private   func   dfs ( _   root :   TreeNode ?)   ->   Int   { 
         guard   let   root   =   root   else   { 
             return   0 
         } 
         let   left   =   max ( 0 ,   dfs ( root . left )) 
         let   right   =   max ( 0 ,   dfs ( root . right )) 
         ans   =   max ( ans ,   root . val   +   left   +   right ) 
         return   root . val   +   max ( left ,   right ) 
     } 
}