LeetCode: Binary Tree Maximum Path Sum

本文介绍了一种使用树形动态规划解决寻找二叉树中最大路径和问题的方法。通过对树的递归遍历,考虑了不同路径组合的情况,并区分了返回值与最优解的概念。文章提供了一个C++实现示例。

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

思路:这里面包含最优解和返回值不同的情况,最优解就是树的一条路径,可能不包含树的根节点,也许树的根节点就处在路径的中间,这样这个最优解就不能向上返回,因为其父节点树的最优解一定会经过树的根节点(如果包含其最优解一部分),所以,返回的值必须是根节点为端点的路径,这样有三种情况:

1)只是根节点;

2)左子树返回值(保证根节点为端点的路径) + 根节点;

3)  右子树返回值 (保证根节点为端点的路径)+ 根节点。

返回其中最大的一个值。

对于最优解,只要随时更新即可,对于当前树,通过 4 种情况更新最优解:

1)只是根节点的值;

2)左子树最优值(不保证根节点为端点的路径) + 根节点值;

3)  右子树返回值 (不保证根节点为端点的路径)+ 根节点值。

4)左子树返回值(不保证根节点为端点的路径)+ 右子树返回值 (不保证根节点为端点的路径) + 根节点值;

最后只需要利用整棵树的最优值即可。

code :

class Solution {
public:
    int maxValue(TreeNode *root,int &ret){
        if(root->left == NULL && root->right == NULL){
            if(ret < root->val) 
                ret = root->val;
            return root->val;
        }
        int curValue = root->val, valLeft = 0, valRight = 0;
        if(root->left != NULL){
            valLeft = maxValue(root->left,ret);
            if(valLeft >=0)
                curValue += valLeft;
        }
        if(root->right != NULL){
            valRight = maxValue(root->right,ret);
            if(valRight >=0)
                curValue += valRight;
        }
        ret = ret > curValue ? ret : curValue;
        int t1 = valLeft < 0 ? root->val : root->val + valLeft;
        int t2 = valRight < 0 ? root->val : root->val + valRight;
        return t1 > t2 ? t1 : t2;
    }
    int maxPathSum(TreeNode *root) {
        int ret = INT_MIN;
        maxValue(root,ret);
        return ret;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值