每日算法系列【LeetCode 124】二叉树中的最大路径和

简介: 每日算法系列【LeetCode 124】二叉树中的最大路径和

题目描述

给定一个非空二叉树,返回其最大路径和。

本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。

示例1


输入:
[1,2,3]
      1
     / \
    2   3
输出:
6


示例1

输入:
[-10,9,20,null,null,15,7]
     -10
     / \
    9  20
      /  \
     15   7
输出:
42

题解

这是一道树形 dp 入门题,也就是树上的动态规划。

首先要理解它这个输入什么意思,虽然写代码的时候不用你管,已经给你处理成结构体了。输入是一个数组,其实是二叉树的层次遍历,也就是从第一层(根结点)开始,往下一层一层遍历结点,同一层从左往右遍历。

这题要求的是一条路径,路径上的数字之和要最大。我们采用递归来做这题,假设dfs(r)表示以 r 为根结点的子树中最长路径的和,而左右子结点用 l 和 r 来表示

那么有人可能会说,这不是很简单了嘛。一共就下面几种情况:

  1. 只取根结点:r->val
  2. 只取左子树:dfs(l)
  3. 只取右子树:dfs(r)
  4. 取根结点和左子树:r->val + dfs(l)
  5. 取根结点和右子树:r->val + dfs(r)
  6. 取根结点和左子树和右子树:r->val + dfs(l) + dfs(r)

最后的答案就是dfs(root)

然而这样对吗?其实是错的,刚开始我也犯了这样的错误(好久没做树形 dp 了,见笑了)。为什么是错的呢?试想这么一种情况,万一左子树的最优解是不经过左子结点的话,怎么与根结点连接起来呢?这种情况下你的计算就有问题了,所以我们必须加强一下之前的假设。

这次我们假设dfs(r)表示以 r 为根结点的子树中经过根结点 r 的最长路径的和。现在继续分成上面的几种情况讨论,然而最后的dfs(root)意思变了,指的是必须经过根结点 root 的最优路径之和。那怎么办呢?很好办,只需要用一个全局变量,每次递归的时候都更新一下最大值就行了,因为总有一个结点是最优路径所在子树的根结点。

分析到这里,貌似都对了,但是还有问题吗?注意看上面的第2、3、6三种情况,如果最优情况是这三种,然后用它们更新dfs(r),会出现什么情况?情况2、3会导致回溯之后,在根结点 r 处断开了,也就是不经过 r 了,那再高层也就没法求解了。而情况6会导致路径出现左右分叉,这也是不允许的。所以递归的最后更新时,只能用其他三种情况更新。

代码

c++

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int res = INT_MIN;
    int maxPathSum(TreeNode* root) {
        dfs(root);
        return res;
    }
    int dfs(TreeNode* root) {
        if (root == NULL) return 0;
        int l_max_sum = dfs(root->left);
        int r_max_sum = dfs(root->right);
        int sum = root->val;
        sum = max(sum, sum + l_max_sum);
        sum = max(sum, sum + r_max_sum);
        res = max(res, sum);
        return max({0, l_max_sum, r_max_sum}) + root->val;
    }
};

python


# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    res = -sys.maxsize
    def maxPathSum(self, root: TreeNode) -> int:
        self.dfs(root)
        return self.res
    def dfs(self, root: TreeNode) -> int:
        if root == None:
            return 0
        l_max_sum = self.dfs(root.left)
        r_max_sum = self.dfs(root.right)
        sum = root.val
        sum = max(sum, sum + l_max_sum)
        sum = max(sum, sum + r_max_sum)
        self.res = max(self.res, sum)
        return max(0, l_max_sum, r_max_sum) + root.val

后记

这题虽然是困难题,但是也是树形 dp 的入门题,思考起来和实现起来 trick 还是挺多的。

相关文章
|
27天前
|
机器学习/深度学习 算法 C++
【DFS/回溯算法】2016年蓝桥杯真题之路径之谜详解
题目要求根据城堡北墙和西墙箭靶上的箭数,推断骑士从西北角到东南角的唯一路径。每步移动时向正北和正西各射一箭,同一格不重复经过。通过DFS回溯模拟“拔箭”过程,验证路径合法性。已知箭数约束路径唯一,最终按编号输出行走顺序。
|
28天前
|
传感器 机器学习/深度学习 编解码
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
146 3
|
2月前
|
算法 机器人 定位技术
【VRPTW】基于matlab秃鹰算法BES求解带时间窗的骑手外卖配送路径规划问题(目标函数:最优路径成本 含服务客户数量 服务时间 载量 路径长度)(Matlab代码实现)
【VRPTW】基于matlab秃鹰算法BES求解带时间窗的骑手外卖配送路径规划问题(目标函数:最优路径成本 含服务客户数量 服务时间 载量 路径长度)(Matlab代码实现)
|
28天前
|
机器学习/深度学习 传感器 算法
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
112 2
|
1月前
|
机器学习/深度学习 传感器 算法
基于全局路径的无人地面车辆的横向避让路径规划研究[蚂蚁算法求解](Matlab代码实现)
基于全局路径的无人地面车辆的横向避让路径规划研究[蚂蚁算法求解](Matlab代码实现)
129 8
|
11天前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
1月前
|
算法 数据挖掘 区块链
基于遗传算法的多式联运车辆路径网络优优化研究(Matlab代码实现)
基于遗传算法的多式联运车辆路径网络优优化研究(Matlab代码实现)
|
1月前
|
存储 算法 数据可视化
基于禁忌搜索算法的TSP问题最优路径搜索matlab仿真
本程序基于禁忌搜索算法解决旅行商问题(TSP),旨在寻找访问多个城市的最短路径。使用 MATLAB 2022A 编写,包含城市坐标生成、路径优化及结果可视化功能。通过禁忌列表、禁忌长度与藐视准则等机制,提升搜索效率与解的质量,适用于物流配送、路径规划等场景。
|
1月前
|
机器学习/深度学习 负载均衡 算法
【卡车和无人机协同配送路径优化】遗传算法求解利用一辆卡车和两架无人机配合,将小包裹递送给随机分布的客户,以使所有站点都由卡车或无人机递送一次后返回起始位置(中转站)研究(Matlab代码实现)
【卡车和无人机协同配送路径优化】遗传算法求解利用一辆卡车和两架无人机配合,将小包裹递送给随机分布的客户,以使所有站点都由卡车或无人机递送一次后返回起始位置(中转站)研究(Matlab代码实现)
162 7
|
1月前
|
机器学习/深度学习 传感器 算法
基于matlab瞬态三角哈里斯鹰算法TTHHO多无人机协同集群避障路径规划(目标函数:最低成本:路径、高度、威胁、转角)(Matlab代码实现)
基于matlab瞬态三角哈里斯鹰算法TTHHO多无人机协同集群避障路径规划(目标函数:最低成本:路径、高度、威胁、转角)(Matlab代码实现)