leetcode124二叉树最大路径和

第一选择是将其转化成图用动态规划,但这样还是太麻烦

使用递归的思路,对于当前的节点root,分别求左右孩子到当前节点的单项路径权值最大的路径权值,然后记包含当前节点的路径权值为 path_price=root->val+left_gain+right_gain,取sum_max和他较大的;

返回左右孩子权值最大的单向路径(只往上不拐弯)的权值(这需要好好理解,因为更新权值的式子是root->val+left_gain+right_gain,即从左子路到根再到右子路的一条式子,所以计算left_gain与right_gain需要返回这样的值)

 

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int maxPathSum(TreeNode* root) {
        //化为带权的图,求最大路径
        //递归,分解问题
        max_gain(root);
        return sum_max;
    }
    int max_gain(TreeNode* root){
        if(root==NULL) return 0;
        
        //0代表不选择该路径
        int left_gain=max(max_gain(root->left),0);
        int right_gain=max(max_gain(root->right),0);
        
        int path_price=root->val+left_gain+right_gain;
        sum_max=max(path_price,sum_max);
        
        //返回值//左右选一条是因为递归时,需要从子节点选一条路径到当前根节点;而当前最大值由sum_max记录
        return root->val+max(left_gain,right_gain);
    }
private:
    int sum_max=INT_MIN;
};

 

转载于:https://www.cnblogs.com/joelwang/p/11077337.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值