• 【leetcode】【剑指offer Ⅱ】051. 节点之和最大的路径


    问题描述:

    • 路径被定义为一条从树中任意节点出发,沿父节点、子节点连接,达到任意节点的序列。
      • 同一个节点在一条路径序列中至多出现一次。
      • 该路径至少包含一个节点,且不一定经过根节点。
      • 路径和是路径中各节点值的总和。
    • 给定一个二叉树的根节点 root,返回其最大路径和,即所有路径上节点值之和的最大值。
      • 节点的取值范围为 [-1000, 1000]

    核心思路:

    • 该题是二叉树相关题目中较难的一类,需要考虑的情况较多。
    • 首先理解在每个节点如何更新最大路径和。
      • 外部维护一个结果变量 ans 记录最大路径和。
      • 在当前节点 cur 取得左右子的最大路径和,即 l = dfs(cur->left), r = dfs(cur->right)
      • 那么在当前节点可以判断得到的最大路径和为 cur->valcur->val + lcur->val + rcur->val + l + r 其中的一种,即 ans = max(ans, cur->val, cur->val + l, cur->val + r, cur->val + l + r)
      • 之所以出现四种情况,是因为 lr 可能出现负值。
      • 这里就可以用一个方法来简化答案,当 lr 是负数时,将其置为 0 视为不拼接路径,即 l = max(0, dfs(cur->left)), r = max(0, dfs(cur->right)),此时更新 ans 的代码变得更简洁了,即 ans = max(ans, cur->val + l + r)
    • 最后递归函数返回的是可以传递给父节点的路径和,传递给父节点就意味着路径向上延申,因此只可能是 cur->val + lcur->val + r 的一种,取两者的最大值即可。

    代码实现:

    class Solution
    {
    private:
        int ans = INT_MIN;
        int dfs(TreeNode* root)
        {
            if(!root) return 0;
            int l = max(0, dfs(root->left));
            int r = max(0, dfs(root->right));
            ans = max(ans, l + r + root->val);
            return max(l + root->val, r + root->val);
        }
    public:
        int maxPathSum(TreeNode* root)
        {
            dfs(root);
            return ans;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
  • 相关阅读:
    linux设备模型:kset及设备驱动抽象类(class)分析
    【Linux】nohub指令--终端退出后命令仍旧执行
    vue实现CBC加密/解密
    Java中的Properties类
    Zookeeper与Hadoop集群的启动的不同点
    SphereEx苗立尧:云原生架构下的Database Mesh研发实践
    原型和原型链
    智能多价格-面向电商的全栈开发利器
    [ARM入门]ARM模式及其切换、异常
    9.3 链表从指定节点插入新节点
  • 原文地址:https://blog.csdn.net/weixin_44705592/article/details/126595605