leetcode-Binary Tree Maximum Path Sum

本文介绍了一种求解二叉树中任意两点间最大路径和的算法,通过递归方式找出经过每个节点的最大单边路径和,并利用这些信息更新全局最大路径和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given a binary tree, find the maximum path sum.

The path may start and end at any node in the tree.

For example:
Given the below binary tree,

       1
      / \
     2   3

Return 6.

这道题是要求出二叉树任两个节点的路径中节点值累加起来最大的总和,可能两个节点是相同的,就变为一个节点的值,总之是要求出最大的路径和。

要想找出最大路径和,我们可以分别找出经过根节点左(右)孩子出发的单方向的最大路径和(这条路径没有经过左(右)孩子的左右两边),然后再决定根节点是否要加上这两个最大值,如果有负的单方向最大路径和就不会加上,如果为正,则加上根节点的值之后更新全局最大和。在每个孩子节点进行这样的查找操作后更新最大值,并返回该从该孩子节点出发的单向最大路径和,使得父节点可以进行类似的比较更新操作。

感觉这个思路有点绕,还是要花时间找出比较容易理解的方法来。

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int maxPathSum(TreeNode *root) {
        // IMPORTANT: Please reset any member data you declared, as
        // the same Solution instance will be reused for each test case.
        if (root==NULL)
            return 0;
        maxSum = INT_MIN;
        findMaxPathSum(root);
        return maxSum;
    }
    
    int findMaxPathSum(TreeNode *root) {    //找从root出发的左边或右边的最大和
        if (root->val > maxSum)
            maxSum = root->val;
            
        if (root->left==NULL && root->right==NULL) 
            return root->val;
        
        int maxLeft = INT_MIN;
        int maxRight = INT_MIN;
        
        if (root->left)
            maxLeft = findMaxPathSum(root->left);   //计算root左边的最大和
        
        if (root->right)
            maxRight = findMaxPathSum(root->right);  //计算root右边的最大和
        
        /* 判断加上左边、右边还是两边的最大和, 并更新最大值maxSum */
        
        if (maxLeft>0) 
            root->val+maxLeft > maxSum ? (maxSum=root->val+maxLeft) : 0;
        
        if (maxRight>0) 
            root->val+maxRight > maxSum ? (maxSum=root->val+maxRight) : 0;
        
        if (maxLeft>0&&maxRight>0)
           root->val+maxLeft+maxRight > maxSum ? (maxSum=root->val+maxLeft+maxRight) : 0;
        
        /* 返回从root出发的单边的最大和 */
        
        int pathSum = maxLeft > maxRight ? maxLeft : maxRight;

        return pathSum>0 ? root->val + pathSum : root->val;
    }
private:
    int maxSum;
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值