【错题集-编程题】二叉树中的最大路径和(树形dp)

简介: 【错题集-编程题】二叉树中的最大路径和(树形dp)

牛客对应题目链接:二叉树中的最大路径和_牛客题霸_牛客网

力扣对应题目链接:124. 二叉树中的最大路径和 - 力扣(LeetCode)


一、分析题目

树形 dp

  • 左子树收集:以左子树为起点的最大单链和。
  • 右子树收集:以右子树为起点的最大单链和。
  • 根节点要做的事情:整合左右子树的信息,得到经过根节点的最大路径和
  • 向上返回:以根节点为起点的最⼤单链和。

二、代码

//值得学习的代码
class Solution
{
public:
    int ret = -1010;
 
    int maxPathSum(TreeNode* root) 
    {
        dfs(root);
        return ret;
    }
 
    int dfs(TreeNode* root)
    {
        if(root == nullptr) return 0;
 
        int l = max(0, dfs(root->left));// 左⼦树的最⼤单链和
        int r = max(0, dfs(root->right)); // 右⼦树的最⼤单链和
        // 经过root的最⼤路径和
        ret = max(ret, root->val + l + r);
 
        return root->val + max(l, r);
    }
};
 
//力扣AC代码
/**
 * 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 maxGain(TreeNode* node)
    {
        if(node==nullptr) return 0;
        int leftGain=max(0, maxGain(node->left));
        int rightGain=max(0, maxGain(node->right));
        int sum=leftGain+rightGain+node->val;
        maxSum=max(maxSum, sum);
        return node->val+max(leftGain, rightGain);
    }
    int maxPathSum(TreeNode* root) {
        maxGain(root);
        return maxSum;
    }
};


相关文章
|
6月前
【一刷《剑指Offer》】面试题 18:树的子结构
【一刷《剑指Offer》】面试题 18:树的子结构
|
6月前
|
算法 Java 定位技术
【数据结构与算法】递归、回溯、八皇后 一文打尽!
【数据结构与算法】递归、回溯、八皇后 一文打尽!
|
6月前
|
API
【二叉树】练习题终章
【二叉树】练习题终章
49 0
|
6月前
LeetCode 树-简单题 4个典例
LeetCode 树-简单题 4个典例
27 0
|
6月前
|
NoSQL 容器 消息中间件
递归题目树型实战
递归题目树型实战
|
存储
二叉树相关问题细谈递归(上)
二叉树相关问题细谈递归
70 0
二叉树相关问题细谈递归(下)
二叉树相关问题细谈递归(下)
63 0
|
算法
代码随想录算法训练营第十七天 | LeetCode 110. 平衡二叉树、257. 二叉树的所有路径、404. 左叶子之和
代码随想录算法训练营第十七天 | LeetCode 110. 平衡二叉树、257. 二叉树的所有路径、404. 左叶子之和
43 0
|
算法
代码随想录算法训练营第十九天 | LeetCode 654. 最大二叉树、617. 合并二叉树、700. 二叉搜索树中的搜索、98. 验证二叉搜索树
代码随想录算法训练营第十九天 | LeetCode 654. 最大二叉树、617. 合并二叉树、700. 二叉搜索树中的搜索、98. 验证二叉搜索树
58 0
轻轻松松学递归
轻轻松松学递归