【错题集-编程题】二叉树中的最大路径和(树形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;
    }
};


相关文章
|
9月前
|
算法 JavaScript 前端开发
递归的递归之书:第五章到第九章
递归的递归之书:第五章到第九章
168 0
|
存储 算法
【每日挠头算法题(6)】二叉树的所有路径|神奇字符串
【每日挠头算法题(6)】二叉树的所有路径|神奇字符串
|
30天前
|
存储 算法 C++
【C++数据结构——查找】顺序查找(头歌实践教学平台习题)【合集】
若查找的关键字k=5,则SeqSearch函数输出是3,6,2,10,1,8,5,并返回值7。若查找的关键字为k=15,则函数输出是3,6,2,10,1,8,5,7,4,9,并返回值0。假设顺序表中R的关键字依次是3,6,2,10,1,8,5,7,4,9,(第一行是输入的一组原始关键字数据,第二行是要查找的关键字)顺序查找算法中要依次输出与k所比较的关键字,用空格分隔开。本关任务:实现顺序查找的算法。开始你的任务吧,祝你成功!
35 8
|
9月前
【错题集-编程题】字母收集(动态规划 - 路径问题)
【错题集-编程题】字母收集(动态规划 - 路径问题)
|
9月前
【错题集-编程题】过河卒(动态规划-路径问题)
【错题集-编程题】过河卒(动态规划-路径问题)
|
9月前
|
Java
想要小黄过软考—小小的树(软件设计师篇)
想要小黄过软考—小小的树(软件设计师篇)
轻轻松松学递归
轻轻松松学递归
|
存储 算法 Java
Java数据结构与算法分析(十)B树图文详解(含完整代码)
迄今为止,已经介绍了《 二叉查找树 》和《 AVL树 》,我们始终假设可以把整个数据结构存储在内存中。可是,如果数据多到内存装不下,这就意味着必须把数据放在磁盘上,显然这些数据结构不再适用。 问题在于磁盘的I/O速度是远远不如内存访问速度的,然而从一棵树中查找到某个元素,必须从根节点一层层往下找,这每一次查找便是一次I/O操作。为了提高性能,就必须要减少查找的次数。 如能减少树的高度、增加每个节点中的元素数,便是种有效的解决方案。实现这种想法的一种方法是使用B树。
195 1
|
存储 算法
学会二叉树不知道干啥?二叉树的深度优先搜索和广度优先搜索,我要打十个乃至二十个(打开你的LeetCode撸起来)学练并举
学会二叉树不知道干啥?二叉树的深度优先搜索和广度优先搜索,我要打十个乃至二十个(打开你的LeetCode撸起来)学练并举
学会二叉树不知道干啥?二叉树的深度优先搜索和广度优先搜索,我要打十个乃至二十个(打开你的LeetCode撸起来)学练并举
第七章递归知识讲解。(二)
第七章递归知识讲解。(二)
114 0