

二叉树中的最大路径和 是一个涉及到二叉树的经典动态规划问题。给定一棵二叉树,其中每个节点包含一个整数值,求出从任意节点开始到任意节点结束(路径上至少包含一个节点)的路径中的最大和。路径可以从树中的任意节点开始和结束,且必须沿着父节点和子节点之间的边走。
该问题的难点在于路径可以穿过树的任意部分,因此我们需要同时考虑左右子树的贡献,并且动态更新最大路径和。
给定一棵二叉树,其中每个节点包含一个整数值,要求找到一条路径,使路径上的节点值之和最大。路径至少包含一个节点,且不一定经过根节点。
我们可以通过递归的方式来求解该问题。对于每个节点,我们有两种情况:
max_gain(node):
node,它的最大贡献值等于:
其中,max_gain(node.left) 和 max_gain(node.right) 分别表示左子树和右子树的最大贡献值,若某一侧的贡献值为负,则不应选择该侧路径(故取最大值和 0 进行比较)。
max_sum:
max_sum,用于存储遍历过程中遇到的最大路径和。max_sum,则更新 max_sum。node,路径和的更新公式为:
price_newpath 表示从左子树、右子树延伸到该节点的新路径的和。
max_gain(node) 来计算从当前节点出发的最大贡献值。max_sum,即全局最大路径和。function maxPathSum(root):
max_sum = -infinity
function max_gain(node):
if node is None:
return 0
left_gain = max(max_gain(node.left), 0)
right_gain = max(max_gain(node.right), 0)
price_newpath = node.val + left_gain + right_gain
max_sum = max(max_sum, price_newpath)
return node.val + max(left_gain, right_gain)
max_gain(root)
return max_sumO(n),其中 n 为节点的个数。price_newpath = node.val + left_gain + right_gain,最大贡献值的返回公式 return node.val + max(left_gain, right_gain)。O(n),适合处理中等规模的树形结构。以上就是二叉树中的最大路径和问题的基本思路。
class Solution:
def maxPathSum(self, root: TreeNode) -> int:
self.max_sum = float('-inf') # 初始化最大路径和为负无穷
# 递归函数,计算当前节点的最大贡献值
def max_gain(node):
if not node:
return 0
# 递归计算左右子树的最大贡献值,负数直接取0
left_gain = max(max_gain(node.left), 0)
right_gain = max(max_gain(node.right), 0)
# 当前节点的路径和
price_newpath = node.val + left_gain + right_gain
# 更新全局最大路径和
self.max_sum = max(self.max_sum, price_newpath)
# 返回该节点的最大贡献值
return node.val + max(left_gain, right_gain)
# 调用递归函数计算
max_gain(root)
return self.max_summax_sum 来存储最大路径和,初始值设为负无穷。max_gain(node),计算每个节点的最大贡献值,并动态更新 max_sum。max_sum,即二叉树中的最大路径和。class Solution {
public:
int max_sum = INT_MIN; // 初始化最大路径和为负无穷
// 递归函数,计算当前节点的最大贡献值
int max_gain(TreeNode* node) {
if (!node) return 0;
// 递归计算左右子树的最大贡献值,负数直接取0
int left_gain = max(max_gain(node->left), 0);
int right_gain = max(max_gain(node->right), 0);
// 当前节点的路径和
int price_newpath = node->val + left_gain + right_gain;
// 更新全局最大路径和
max_sum = max(max_sum, price_newpath);
// 返回该节点的最大贡献值
return node->val + max(left_gain, right_gain);
}
int maxPathSum(TreeNode* root) {
max_gain(root);
return max_sum;
}
};max_sum 来存储最大路径和,初始值设为 INT_MIN。max_gain(node),计算每个节点的最大贡献值,并动态更新 max_sum。max_sum,即二叉树中的最大路径和。O(n),每个节点只访问一次,适合处理中等规模的二叉树问题。