LeetCode-124

LeetCode-124

问题复述

给一个二叉树的根节点root,求出从某一点出发得到的最大路径和。

解释一下:最大路径和中的路径可以是从某一双亲节点出发的路径,也可以是从某一叶子节点出发的路径。这就导致,如果从某一双亲节点出发,只能选择两个子节点中代价大的,也可能是从子节点出发,经过双亲节点的路径。所以程序中maxSum=max(maxSum,node->val+left+right)判断的是第二种情况,接着return max(left,right)+node->val这里是第一中情况,返回节点代价为上一层节点的判断提供依据。若上一层中 maxSum 比较出的值任然是原值,则表示第二种情况拥有最大路径和,而倘若 maxSum 更新了则表示下一层选择的路径是子节点中的一个。

理解递归的逻辑是关键,同时用框架的思维看,这一题就是后序遍历。

解决方案

利用递归,求出子节点的代价,再更新 maxSum 值,返回子节点选择出的最大代价路径的代价(只能选择左右中的一条,或者不选为0),递归返回到上一层。上一层判断是 max(left,right)+node->valnode->val+left+right 大小。

程序源码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
private:
     int maxSum=INT_MIN;
public:
    int maxPathNode(TreeNode* node){
        if(node==nullptr)
            return 0;
        int left=max(0,maxPathNode(node->left));    //节点值大于零才被选入
        int right=max(0,maxPathNode(node->right));

        maxSum=max(maxSum,node->val+left+right);    //更新最大路径和

        return max(left,right)+node->val;   //相当于后序遍历
    }
    int maxPathSum(TreeNode* root) {
        maxPathNode(root);
        return maxSum;
    }
};
上一篇:北京交通大学2021年高等代数考研试卷


下一篇:东南大学2021年高等代数考研试卷