[LeetCode] 124. Binary Tree Maximum Path Sum 求二叉树的最大路径和
Given a non-empty binary tree, find the maximum path sum.
For this problem, a path is defined as any sequence of nodes from some starting node to any node in the tree along the parent-child connections. The path must contain at least one node and does not need to go through the root.
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
给一个非空二叉树,找出最大路径和。
解法:递归,与常规path sum不同,这题的path sum可以不起始于root,也可以不终止于leaf。
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public class Solution { int maxValue; public int maxPathSum(TreeNode root) { maxValue = Integer.MIN_VALUE; maxPathDown(root); return maxValue; } private int maxPathDown(TreeNode node) { if (node == null ) return 0 ; int left = Math.max( 0 , maxPathDown(node.left)); int right = Math.max( 0 , maxPathDown(node.right)); maxValue = Math.max(maxValue, left + right + node.val); return Math.max(left, right) + node.val; } } |
Python:
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 | # Time: O(n) # Space: O(h), h is height of binary tree class TreeNode( object ): def __init__( self , x): self .val = x self .left = None self .right = None class Solution( object ): maxSum = float ( "-inf" ) # @param root, a tree node # @return an integer def maxPathSum( self , root): self .maxPathSumRecu(root) return self .maxSum def maxPathSumRecu( self , root): if root is None : return 0 left = max ( 0 , self .maxPathSumRecu(root.left)) right = max ( 0 , self .maxPathSumRecu(root.right)) self .maxSum = max ( self .maxSum, root.val + left + right) return root.val + max (left, right) |
C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class Solution { public : int maxPathSum(TreeNode* root) { int res = INT_MIN; helper(root, res); return res; } int helper(TreeNode* node, int & res) { if (!node) return 0; int left = max(helper(node->left, res), 0); int right = max(helper(node->right, res), 0); res = max(res, left + right + node->val); return max(left, right) + node->val; } }; |
Follow up: 返回最大路径,递归函数就不能返回路径和,而是返回该路径上所有结点组成的数组,递归的参数还要保留最大路径和,对左右子节点调用递归函数后得到的是数组,统计出数组之和,并且跟0比较,如果小于0,和清零,数组清空。
类似题目:
[LeetCode] 113. Path Sum II 路径和 II
[LeetCode] 437. Path Sum III 路径和 III
[LeetCode] 666. Path Sum IV 二叉树的路径和 IV
[LeetCode] 687. Longest Univalue Path 最长唯一值路径
[LeetCode] 129. Sum Root to Leaf Numbers 求根到叶节点数字之和
All LeetCode Questions List 题目汇总
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步