49.二叉树的最大路径和

1.题目描述

2.思路

借鉴了评论区的哥们ID:

烟雨入江南

awesome-kapitsa2xl

这道题说难也不难,但说容易也真不是那么容易能想到的(写得比较多,但都是心得,耐心看完就更上一层楼了)。

首先就是递归的方式,很多人都对递归一头雾水,一看就会,一写就废。不用担心,这是正常现象。

下面,我们详细解释一下这道题,顺便疏通一下递归的基本思路。

我们不要先去考虑整个递归的代码怎么去写,而是要明确一个递归的主体,就是这个递归的主体要怎么构造,然后再去想边界条件,返回值等等。

1、那么,首先我们可以假设走到了某个节点,现在要面临的问题是路径的最大值问题,显然对于这种问题,每遍历到一个节点,我们都要求出包含该节点在内的此时的最大路径,并且在之后的遍历中更新这个最大值。对于该节点来说,它的最大路径currpath就等于左右子树的最大路径加上本身的值,也就是currpath = left+right+node,val,但是有一个前提,我们要求的是最大路径,所以若是left或者right小于等于0了,那么我们就没有必要把这些值加上了,因为加上一个负数,会使得最大路径变小。这里的最大路径中的最其实就是一个限定条件,也就是我们常说的贪心算法,只取最大,最好,其余的直接丢弃。

2、好了,1中的主体我们已经明确了,但是还存在一个问题,那就是left和right具体应该怎么求,也就是left和right的递归形式。显然我们要把node.left和node.right再次传输到递归函数中,重复上述的操作。但如果到达了叶子节点,是不是需要往上一层返回了呢?那么返回值又是多少呢?

我们要明确left和right的基本含义,它们表示的是最大贡献,那么一个节点的最大贡献就等于node.val+max(left,right),这个节点本身选上,然后从它的左右子树中选择最大的那个加上。

对于叶子节点也是这样,但是叶子节点的左右子树都为空,所以加上0,哎,注意看,此时是不是边界条件也出来了,但节点为空时,返回0 。 好了,至此循环的主体,返回值,边界条件都定义好了,那么整个递归的代码是不是就水到渠成了。这样一看递归也没什么了不起的!!!

ps:除了向下思考,其实也可以向上思考,比如还是遍历到了某个节点,那么这个节点向上一层走,是不是要有一个返回值呢,那么返回值是什么呢?是不是和自己原来需要的right(or left)相同,只不过现在轮到自己了,自己原来需要最大贡献,那么此时返回时就返回最大贡献,自己的最大贡献不就是node.val+max(left,right)。就像是老板一层一层的压榨员工一样。

3.代码

cpp 复制代码
class Solution {
public:
    int res=INT_MIN;
    int maxPathSum(TreeNode* root) {
        if(root==NULL) return 0;
        dfs(root);
        return res;
    }
    int dfs(TreeNode* root){//递归经过当前节点的最大路径,并且向上返回max(devoteleft,devoteright)+root->val
    if(root==NULL) return 0;
    int l_devotion = dfs(root->left);
    int r_devotion = dfs(root->right);
    res = max(res,l_devotion+r_devotion+root->val);//全局变量,记录最长路径
    return max(max(l_devotion,r_devotion)+root->val,0);//向上返回的是自己的val+max(left贡献,right贡献),当贡献是负数的时候表示不需要这个节点,直接返回0
        
    }
};
相关推荐
2501_946961471 小时前
AI 生成个人简历 PPT 定制化模板直接用
深度优先
源代码•宸1 小时前
Leetcode—144. 二叉树的前序遍历【简单】
经验分享·算法·leetcode·面试·职场和发展·golang·dfs
m0_736919102 小时前
C++中的观察者模式
开发语言·c++·算法
Anastasiozzzz2 小时前
LeetCodeHot100 347. 前 K 个高频元素
java·算法·面试·职场和发展
fantasy_arch2 小时前
SVT-AV1编码 递归子块划分
算法·av1
jay神2 小时前
基于深度学习和协同过滤算法的美妆商品推荐系统
人工智能·深度学习·算法·毕业设计·协同过滤算法
不穿格子的程序员2 小时前
从零开始写算法——图论篇2:课程表 + 实现前缀树(26叉树)
算法·深度优先·图论·dfs·bfs
啊阿狸不会拉杆2 小时前
《数字信号处理》第5章-数字滤波器的基本结构
python·算法·机器学习·matlab·信号处理·数字信号处理·dsp
AI 菌2 小时前
视觉令牌压缩:Vision-centric Token Compression in Large Language Model
人工智能·算法·语言模型·llm