二叉树中的最大路径和

递归。

递归时,将每个结点作为一个根结点传入递归函数。对于当前的这个结点,以它为根结点,计算它左子树路径的最大和,右子树路径的最大和。通过这个结点,当前是看做是以它根结点,这个结点的最大路径和就是:左子树最大路径和(大于0的话)+右子树最大路径和(大于0的话)+根结点的值。然后更新当前计算的MAX是多少,也就是我们的结果。

递归函数的返回值是:当前这个结点的左子树最大路径和,或者是右子树最大路径和。再加上结点值。因为,这样得到的一条最大路径,就可以作为这个结点的父节点的一条路径,用于父节点的计算。

/**
 * 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 max_res;
    
    int maxPathSum(TreeNode *root) {
        if(root == nullptr)
            return 0;
        max_res = INT_MIN;
        maxsum(root);
        return max_res;
    }
    
    int maxsum(TreeNode* root)
    {
        if(root == nullptr)
            return 0;
        int left_max = max(0,maxsum(root->left));
        int right_max = max(0,maxsum(root->right));
        max_res = max(max_res,left_max + right_max + root->val);
        return max(left_max,right_max) + root->val;
    }
    
};

猜你喜欢

转载自blog.csdn.net/qq_22080999/article/details/80990348