【LeetCode】124. 二叉树中的最大路径和

2023-05-16

题目链接:124. 二叉树中的最大路径和
题目描述
在这里插入图片描述
思路:这类题目一般可以通过dfs方式完成,首先我们明白,想要获取这棵二叉树中的最大路径和,那么我们需要知道以每个节点为根的最大路径和,最后找最大的就可以得到答案。那么如何找一个节点的最大路径和呢,一个节点的最大路径和为它的左右两边节点的贡献值当前这个节点值相加的结果,因此,在dfs时候我们需要获取的就是当前节点的最大贡献值,最终每个节点最多会被遍历一次,总的时间复杂度为O(n)。
代码

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */

func maxPathSum(root *TreeNode) int {
    // 初始给一个最小值或者root.val,给root.val要考虑root是否为nil
    maxSum := math.MinInt32
    dfs(root,&maxSum)
    return maxSum
}

func dfs(node *TreeNode, maxSum *int) int {
    if node == nil {
        return 0
    }
    // 获取左边子节点的贡献,大于0的才计算curPathSum贡献
    leftVal := max(dfs(node.Left, maxSum), 0)
    // 获取右边子节点贡献
    rightVal := max(dfs(node.Right, maxSum), 0)
    // 记录当前节点的最大路径和
    curPathSum := node.Val + leftVal + rightVal
    // 记录路径和中的最大值
    *maxSum = max(*maxSum, curPathSum)
    // 返回当前节点的最大贡献值
    return node.Val + max(leftVal,rightVal)
}

func max(x, y int) int {
    if x > y {
        return x
    }
    return y
}

这题还能用划分子问题的方式思考,变成动态规划,思路和dfs差不多,下面摘自评论区大佬解答,便于理解:

这题目的难点在于理解题意和转化题意。
我们可以结合 数组的最大子数组和 的思路去解题。

1. 「可以从任意节点出发, 到达任意节点」 的路径, 
   一定是先上升( 0 ~ n 个)节点, 到达顶点, 后下降( 0 ~ n 个)节点。
   我们可以通过枚举顶点的方式来枚举路径。
   
2. 我们枚举顶点时, 可以把路径分拆成3部分: 左侧路径、右侧路径和顶点。
   如下面的路径, 顶点为 20, 左侧路径为 6 -> 15, 右侧为 6 -> 7-10
      / \
     9 [20]
       /  \
     [15] [7]
     /    / \
   [6]   4  [6]   

   以当前节点为顶点的路径中, 最大和为 两侧路径的最大和 + 节点的值。
   需要注意的是, 两侧路径也可能不选, 此时取 03. 如何求两侧路径最大和? 看一个类似问题:求数组的最大子数组和。
   动态规划: dp[i] 代表以 nums[i] 为结尾的子数组的最大和。
   转移方程: dp[i] = max(dp[i-1], 0) + nums[i]4. 在树上, 设 dp[C] 代表以当前节点为结尾的最大上升路径和, 
   则我们需要对节点的左右子树做一个选择, 有
   dp[C] = max(max(dp[L], 0), max(dp[R], 0)) + C.val
   式中, C,L,R 分别代指 当前节点、左子节点、右子节点。

5. 最后, 以当前节点为顶点的路径中, 最大的和为
   max(dp[L], 0) + max(dp[R], 0) + C.val。
   我们枚举顶点, 并记录最大答案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【LeetCode】124. 二叉树中的最大路径和 的相关文章

  • week6限时大模拟A - 掌握魔法の东东 II Gym - 101510B

    week6限时大模拟A 掌握魔法 东东 II Gym 101510B A 掌握魔法 东东 II Gym 101510B题目描述输入输出格式及样例思路实验代码 A 掌握魔法 东东 II Gym 101510B 题目描述 从瑞神家打牌回来后 x
  • C++输出中文字符

    一 c 43 43 输出中文字符 include lt iostream gt include lt locale gt using namespace std void main setlocale LC ALL 34 chs 34 wc
  • 天翼网关F452超级密码获取(亲测有效)

    在网上找了好久的天翼网关F452超级密码获取的贴 xff0c 终于让我找到了 xff0c 直接进入正题 xff0c 分享以下操作方法 xff0c 便各位还在寻找破解方法的同学学习 step1 xff1a 登录网关地址 xff0c 一般为19

随机推荐

  • 深度学习飞桨实战错误及解决方法

    TypeError randn takes from 1 to 3 positional arguments but 4 were given span class token operator span span class token
  • Ubuntu20.04部署ntp服务

    1 前期准备 系统版本 ip地址 Ubuntu20 04镜像 服务端Ubuntu20 0410 1 0 55ubuntu 20 04 5 live server amd64客户端Ubuntu20 0410 1 0 56ubuntu 20 0
  • GItlab:Internal API available: FAILED - Internal API error 502

    Internal API available FAILED Internal API error 502 背景解决方法 背景 安装gitlab时候 xff0c 8080端口被jenkins应用占用 xff0c 启动gitlab时页面报502
  • 链表逆序

    链表逆序的本质就是把没一个节点原本指向的下一个节点的next指针倒转过来 xff0c 指向它的前置节点 让我们从链表头部开始 xff0c 建立三个临时节点的引用 xff0c 分别为p1 xff0c p2 xff0c p3 它们分别指向头节点
  • ubuntu更改环境变量的几种方式

    Ubuntu设置环境变量的几种方法 1 Linux的变量种类 按变量的生存周期来划分 xff0c Linux变量可分为两类 xff1a 1 1 永久的 xff1a 需要修改配置文件 xff0c 变量永久生效 1 2 临时的 xff1a 使用
  • Python 微信自动化工具开发系列01_自动获取微信聊天信息(2023年1月可用)

    前言 一个需求 需要利用Python 43 第三方库wxauto 用于微信上自动获取聊天信息 xff0c 从而根据自己需求对信息自动进行二次处理 xff0c 比如自动回复 xff0c 再比如自动发送文件或者其他 这边使用Python的第三方
  • Python 微信自动化工具开发系列06_根据用户信息自动回复升级版本(2023年1月可用)

    前言 一个需求 需要利用Python 43 第三方库wxauto 用于微信上自动获取聊天信息 xff0c 从而根据自己需求对信息自动进行二次处理 xff0c 比如自动回复 xff0c 再比如自动发送文件或者其他 记录于2022年08月 20
  • [LeetCode]1237. 找出给定方程的正整数解

    题目链接 xff1a https leetcode cn problems find positive integer solution for a given equation description 题目描述 xff1a 样例1 xff
  • 解决svn: E230001: Server SSL certificate verification failed: certificate has expired

    svn拉代码报错 xff1a Error svn E170013 Unable to connect to a repository at URL svn E230001 Server SSL certificate verificatio
  • QGIS3.10工程结构概述

    在windows下 xff0c QGIS3 10源码包可以通过cmake生成VS项目文件 xff0c 从而可以通过Visual Studio查看工程的代码结构以及编译工程项目 xff0c 方便我们学习和使用qgis 本篇文章将介绍在Visu
  • 洛谷题解P1002_过河卒

    题目描述 棋盘上 A点有一个过河卒 xff0c 需要走到目标 B点 卒行走的规则 xff1a 可以向下 或者向右 同时在棋盘上 C点有一个对方的马 xff0c 该马所在的点和所有跳跃一步可达的点称为对方马的控制点 因此称之为 马拦过河卒 棋
  • 关于NAND代码搬移和跳转到SDRAM的理解

    NAND开始将前4KB代码通过硬件搬移到SRAM中执行 xff0c 这4KB代码中包括一段将NAND全部代码搬移到SDRAM中的代码 xff08 全部代码也包括全面4KB xff09 xff0c 在搬移完成后 xff0c 程序执行到其中一个
  • python 动态导入模块和类

    import importlib module 61 39 db DB 39 if isinstance module str module 61 importlib import module module DBObj 61 getatt
  • mongodb 获取集合所有记录中曾出现过的字段

    switch to the db you 39 re using and type mr 61 db runCommand 34 mapreduce 34 34 myCollectionName 34 34 map 34 function
  • JS 闭包的 9 大经典使用场景

    1 返回值 xff08 最常用 xff09 1 返回值 最常用的 function fn var name 61 34 hello 34 return function return name var fnc 61 fn console l
  • 彻底搞懂JS闭包各种坑

    闭包是js开发惯用的技巧 xff0c 什么是闭包 xff1f 闭包指的是 xff1a 能够访问另一个函数作用域的变量的函数 清晰的讲 xff1a 闭包就是一个函数 xff0c 这个函数能够访问其他函数的作用域中的变量 eg function
  • Anaconda 阿里镜像

    简介 Anaconda是一个用于科学计算的Python发行版 xff0c 支持Linux Mac Windows 包含了众多流行的科学计算 数据分析的Python包 下载地址 xff1a https mirrors aliyun com a
  • python 执行shell 并输出

    def run shell self shell 34 34 34 执行shell并随时打印输出 34 34 34 cmd 61 subprocess Popen shell stdin 61 subprocess PIPE stderr
  • 【Mongo】shell命令行模式执行mongo命令

    例子 xff1a mongo host 172 31 36 77 port 27017 u admin p 39 HpyD9KAd JDkHRY9 39 admin eval 34 db currentOp 34 1 交互式 mongo s
  • 【LeetCode】124. 二叉树中的最大路径和

    题目链接 xff1a 124 二叉树中的最大路径和 题目描述 xff1a 思路 xff1a 这类题目一般可以通过dfs方式完成 xff0c 首先我们明白 xff0c 想要获取这棵二叉树中的最大路径和 xff0c 那么我们需要知道以每个节点为