【算法专题训练】31、二叉树路径和

代码随想录-035期-算法训练营【博客笔记汇总表】 阅读详情

1、LCR 049. 求根节点到叶节点数字之和

题目信息:

  • https://leetcode.cn/problems/3Etpl5/description/
给定一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。
每条从根节点到叶节点的路径都代表一个数字:

例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。
计算从根节点到叶节点生成的 所有数字之和 。
叶节点 是指没有子节点的节点。

示例 1:
输入:root = [1,2,3]
输出:25
解释:
从根到叶子节点路径 1->2 代表数字 12
从根到叶子节点路径 1->3 代表数字 13
因此,数字总和 = 12 + 13 = 25

示例 2:
输入:root = [4,9,0,5,1]
输出:1026
解释:
从根到叶子节点路径 4->9->5 代表数字 495
从根到叶子节点路径 4->9->1 代表数字 491
从根到叶子节点路径 4->0 代表数字 40
因此,数字总和 = 495 + 491 + 40 = 1026

提示:
树中节点的数目在范围 [1, 1000] 内
0 <= Node.val <= 9
树的深度不超过 10

解题思路:

  • 1、审题:输入一棵二叉树,二叉树中结点值的数据范围为0到9的数字,现在要求找到从根节点到叶子结点组合成的数字,并将這些数字全部相加
  • 2、解题:
  • 使用前序遍历,将从根节点到叶子结点的组成的数字全部返回,组成数字的规则,是在之前的数字基础上乘以10再加上当前遍历的节点值
  • 如果遍历到了空节点则返回0,如果遍历到了叶子结点则返回当前遍历到的数据,如果还存在左右子节点,则继续前序遍历,返回左右子树的组合数字之和

代码实现:

int dfs(TreeNode *node, int num)
{
    if (node == nullptr)
    {
        return 0;
    }
    // 到当前结点的路径和
    int path = num * 10 + node->val;
    // 叶子结点
    if (node->left == nullptr && node->right == nullptr)
    {
        return path;
    }

    // 还存在左右子树
    return dfs(node->left, path) + dfs(node->right, path);
}

int sumNumbers(TreeNode *root)
{
    return dfs(root, 0);
}

2、LCR 050. 路径总和 III

题目信息:

  • https://leetcode.cn/problems/6eUYwP/description/
给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。
路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

示例 1:
输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8
输出:3
解释:和等于 8 的路径有 3 条,如图所示。

示例 2:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:3

提示:
二叉树的节点个数的范围是 [0,1000]
-109 <= Node.val <= 109
-1000 <= targetSum <= 1000

解题思路:

  • 1、审题:输入一棵二叉树和一个目标值targetSum,要求找到在二叉树中连续节点的值累加和等于目标值的个数
  • 2、解题:
  • 题目要求在二叉树中连续的结点路径,并没有要求一定要从根节点开始,到叶子结点结束,中间部分的结点路径之和也可以
  • 使用前序遍历法,记录遍历到当前结点的路径之和path,
  • 使用map保存遍历过程中路径之和和对应个数,这样做的目的可以通过当前路径之和path减去目标值targetSum,判断map中是否存在该差值的键,
    • 如果存在则说明到当前结点位置结束,存在一条路径(可能是中间某个节点开始),其路径之和等于目标值
    • 相当于在遍历过程中,遍历到每个节点都有一个路径之和path,且都有一个对应的map集合,键值对为路径之和与路径和对应个数的值
  • 通过判断路径之和与目标值targetSum之差,来判断结果值是否在map集合中是否存在对应的键
  • 因为前序遍历,从根节点开始遍历到左子树再到右子树,path的值是有副本,但是map的值是同一个指针,所以在遍历完当前结点后,需要将到该结点的路径和减去其个数表示退出当前结点
  • 在前序遍历的过程中,将所求问题进行拆解,最终的问题是求输入的目标二叉树中路径和等于目标值的个数,可以拆解为三个部分,
    • 也就是到当前结点位置的个数,和到左右子树的个数,三者之和

代码实现:

int dfs(TreeNode *node, int target, std::map<double, int> map, double path)
{
  if (node == nullptr)
  {
    return 0;
  }
  // 到当前结点时,他的路径之和
  path = path + node->val;
  // 求到当前结点他的路径和的个数
  int count = 0;
  if (map.find(path - target) != map.end()) // 存在这样的路径和
  {
    count = map[path - target];
  }
  // 添加path路径和的个数
  if (map.find(path) != map.end()) // 存在这样的路径和
  {
    int tempC = map[path];
    map[path] = tempC + 1;
  }
  else
  {
    map[path] = 1;
  }

  // 加上到左右子树位置时,他的路径之和
  count += dfs(node->left, target, map, path);
  count += dfs(node->right, target, map, path);

  // 这个节点遍历结束了,则到这个节点的路径和,需要在map中删除
  int tempC = map[path];
  map[path] = tempC - 1;
  return count;
}

int pathSum(TreeNode *root, int targetSum)
{
  std::map<double, int> map;
  map[0] = 1;
  return dfs(root, targetSum, map, 0);
}

3、LCR 051. 二叉树中的最大路径和

题目信息:

  • https://leetcode.cn/problems/jC7MId/description/
路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。
该路径 至少包含一个 节点,且不一定经过根节点。路径和 是路径中各节点值的总和。

给定一个二叉树的根节点 root ,返回其 最大路径和,即所有路径上节点值之和的最大值。

示例 1:
输入:root = [1,2,3]
输出:6
解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6

示例 2:
输入:root = [-10,9,20,null,null,15,7]
输出:42
解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42

提示:
树中节点数目范围是 [1, 3 * 104]

解题思路:

  • 1、审题:输入一棵非空的二叉树,要求在这棵二叉树中,查找一条路径上的结点,要求该路径上的所有节点值和最大,并返回这个最大值
  • 2、解题:
  • 题目要求的该路径没有说要从根节点开始,也没有说要到某个节点结束,可以是树中任意个结点组合成的路径
  • 问题的核心为如何找到这个路径,使用后续遍历方式,遍历这棵二叉树,
  • 将问题进行细化,可以看做左子树,根节点和右子树三个部分,那这条路径可以有好几种情况:
    • 左子树的最大值路径; 右子树的最大值路径; 左子树+根节点+右子树组合成的路径;
    • 而在遍历时返回的值,是当前左子树或者左子树经过当前结点组成的路径和的最大值
  • 所以每次遍历左右子树的时候,都是传入一个对象引用,

代码实现:

int dfs(TreeNode *node, int &maxSum)
{
  if (node == nullptr)
  {
    return 0; // 叶子结点
  }

  // 非叶子结点,获取当前结点下的左子树的最大值
  int leftMaxSum = INT32_MIN;
  // 如果左子树路径上的结点全是负数,则不取这个路径上的任何一个节点
  int left = max(0, dfs(node->left, leftMaxSum));

  // 右子树也一样
  int rightMaxSum = INT32_MIN;
  int right = max(0, dfs(node->right, rightMaxSum));

  // 左右子树的最大值,不包含根节点
  maxSum = max(leftMaxSum, rightMaxSum);

  // 求最大路径和,全路径
  maxSum = max(maxSum, left + right + node->val);

  // 返回左或右子树的最大值路径
  return node->val + max(left, right);
}

int maxPathSum(TreeNode *root)
{
  int maxSum = INT32_MIN;
  dfs(root, maxSum);
  return maxSum;
}

4、总结

  • 二叉树的路径和,是对二叉树进行前序遍历,从根节点开始不断遍历到叶子结点的这一条路径所表示的数字之和,分为左右子树,也就是两个路径之和,直到叶子结点返回0.
  • 二叉树的一段路径之和,在遍历的过程中既要将路径上的节点值累加,也要记录这个路径和的个数,使用map结构保存路径和与对应的个数
  • 二叉树的最大路径和,该路径不要方向,从另一个节点到相邻节点组成的路径和为目标路径和,通过递归的方式,把题目要求缩小来解决。
春招算法刷题攻略:高效构建解题思维与高频考点解析 算法刷题是计算机科学中提升问题解决能力的重要方法,其核心在于通过模式识别和思维训练优化解题效率。从技术原理看,刷题本质是建立‘问题分类→解法联想→边界处理’的思维链路,这与动态规划、二叉树遍历等经典算法的设计思想高度契合。在实际工程场景中,如大厂面试或竞赛准备,科学的刷题方法能显著提升代码质量和解题速度。本文以二叉树题型为例,剖析路径问题、构造问题等高频模式,并结合时间复杂度优化、题型分布等维度,帮助开发者系统提升算法能力。通过专题突破和模拟面试等实践方法,可快速掌握二分查找、滑动窗口等关键技术,适用于春招 阅读详情

相关推荐

【仿真】Carla Python API实战:从零搭建自动驾驶测试环境

本文详细介绍了如何使用Carla Python API从零搭建自动驾驶测试环境。通过Carla仿真平台,开发者可以构建高度逼真的城市环境和车辆物理模型,利用Python API实现传感器配置、数据采集、场景构建及自动驾驶算法集成。文章还分享了实际项目中的调试技巧和性能优化经验,帮助读者快速掌握自动驾驶仿真测试的核心技术。

weixin_29050513的博客 213

代码随想录算法训练营74期完结✌

代码随想录算法训练营74期完结✌

dewi的博客 663

拆解歌尔2718硅麦:2.75mm超小封装背后的MEMS技术解析

本文深度解析歌尔2718硅麦的2.75mm超小封装技术,探讨MEMS麦克风在微型化过程中的声学性能与结构可靠性平衡。通过ASIC芯片堆叠、纳米级应力控制等创新技术,歌尔2718在TWS耳机和智能手机中实现卓越性能,同时克服微型化带来的声学挑战。

weixin_28292761的博客 610

代码随想录算法训练营第13天|110. 平衡二叉树、257. 二叉树的所有路径、404. 左叶子之和

2023 年 3 月 31 日1h0m★\bigstar★★\bigstar★51249先写两道题,明天再看把。

qq_43212651的博客 134

在线机器学习(OML-AD)应对时序数据概念漂移的异常检测实战

时序数据异常检测是监控系统健康、识别业务风险的核心技术。其基本原理是通过预测模型学习数据的正常模式,并将预测误差作为异常判定的依据。然而,当数据背后的统计规律随时间发生变化,即发生概念漂移时,传统的静态模型会失效,导致误报和漏报激增。在线机器学习技术通过增量学习,使模型能够随每个新数据点实时微调,为预测式异常检测提供了动态适应能力,从而在数据流持续演化的场景下保持检测的鲁棒性。这种将预测与检测无缝衔接的OML-AD框架,尤其适用于工业监控、金融风控等对实时性与资源效率要求高的领域,有效解决了概念漂移这一核心

weixin_29889665的博客 530

Rclone替代RaiDrive?零广告免费挂载Alist WebDAV到Windows资源管理器(含自启脚本)

本文详细介绍了如何使用开源工具Rclone替代RaiDrive,实现零广告、全免费的Alist WebDAV挂载方案。通过深入解析配置参数、提供完整的自启动解决方案和解决常见问题,帮助用户在Windows资源管理器中高效管理云存储,提升使用体验。

weixin_33709364的博客 636

代码随想录算法训练营day17|平衡二叉树、二叉树的所有路径、左叶子之和

要判断一个二叉树是否为平衡二叉树,我们首先要判断其根节点的左右两个子树的高度差不能超过1,再去分别判断左右两个子节点左右子树高度差不超过1,以此类推。因此我们可以使用递归的方式来完成。首先判断返回类型和传入参数。显然,返回类型是布尔类型用于判断左右两个子树是否满足平衡二叉树传入参数,需要传入左子节点和右子节点分别作为左右子树的根节点?终止条件,当左子节点和右子节点同时为空,返回true,当左子节点和右子节点都不为空,继续进行判断。当有一个节点为空,继续判断,传入另一个不为空节点的参数。

Saiyan99的博客 132

重构工业交互体验:响应式数据可视化大屏解决方案

从智慧园区到数据中心,从水务监控到风力发电场景,HT 通过 2D/3D 组态技术与响应式布局机制,让数据以更灵活、更精准的方式呈现场景动态 —— 这正是 HT 技术在工业可视化领域的核心价值。例如,在智慧楼宇监控系统中,HT 引擎可实时渲染建筑结构、设备状态与数据流,同时确保画面在不同尺寸屏幕上的一致性。以某工业数据中心大屏为例,HT 通过暗红色主调搭配工业元素,结合粉色与黄色点缀,打破传统深蓝色大屏的视觉定式,同时通过矢量图形确保色彩在不同亮度下的辨识度 —— 这正是 HT 技术在视觉设计上的独特优势。

Hightopo的博客 889

代码随想录算法训练营第十六天 |513. 找树左下角的值、112. 路径总和 、106. 从中序与后序遍历序列构造二叉树

找到。

m0_51795650的博客 752

使用 MATLAB/Simulink + Deep Learning Toolbox,构建一个基于LSTM的电网负荷预测模

本文介绍了一个基于Simulink和深度学习的智能电网负荷预测与调度建模方法。通过LSTM神经网络构建负荷预测模型,将历史负荷、天气、日期等特征作为输入,预测未来24小时负荷。然后将训练好的模型集成到Simulink仿真系统中,结合发电单元模型和经济调度逻辑,实现预测驱动的电力调度优化。实验结果表明,该方法预测误差在2.5%-4.0%之间,相比传统调度方式可降低15%-25%的运行成本。文章详细展示了从数据准备、特征工程、模型训练到系统集成的完整流程,为智能电网中AI技术的应用提供了实用参考。

amy_mhd的博客 171

PR工具timing report中setup time的计算过程

然后去pr工具里报告report_delay_calculation/reportDelayCalculation -from related_pin -to constraint_pin。这里constraint pin就是D pin (D0 D1 D2 D3),related pin就是 CK pin。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 455

_16LeetCode代码随想录算法训练营第十六天-C++二叉树 | 513.找树左下角的值、112.路径总和、113.路径总和ii、106.从中序与后序遍历序列构造二叉树、105.从前序与中序遍历序

_16LeetCode代码随想录算法训练营第十六天-C++二叉树 | 513.找树左下角的值、112.路径总和、113.路径总和ii、106.从中序与后序遍历序列构造二叉树、105.从前序与中序遍历序列构造二叉树

Jasmine-Lily的博客 293

国科大学习资料--机器学习方法与应用(叶齐祥)-期末考试题整理

国科大学习资料–机器学习方法与应用-期末考试题整理 ============================================================================================================================================================================================ =======================================

无名何许人的博客 2852

0算法类型训练

算法训练 基础篇(30 天) 基础永远是最重要的,先把最最基础的这些搞熟,磨刀不误砍柴工。 数组,队列,栈 链表 树与递归 哈希表 双指针 思想篇(30 天) 这些思想是投资回报率极高的,强烈推荐每一个小的专题花一定的时间掌握。 二分 滑动窗口 搜索(BFS,DFS,回溯) 动态规划 提高篇(31 天) 这部分收益没那么明显,并且往往需要一定的技术积累。出现的频率相对而言比较低。但是有的题目需要你使用这些技巧。又或者可以使用这些技巧可以实现**「降维打击」**。 贪心 分治 位运算 KMP &am

mhywoniu的博客 1176

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

代码随想录算法训练营第四期第十七天 | 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和

还没补完,落的太多了,补了也没完全吃透,只能说先过一遍

qyy123ise的博客 103

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

算法训练营 第十八天

day05~

qq_39985186的博客 137

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

代码随想录算法训练营第十五天| 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和、222.完全二叉树的节点个数...

文章链接:110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和、222.完全二叉树的节点个数视频链接:110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和、222.完全二叉树的节点个数题目链接:110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和、222.完...

weixin_32475629的博客 125

代码随想录算法训练营第十八天 | 513.找树左下角的值、112.路径总和、113.路径总和Ⅱ、106.从中序与后序遍历序列构造二叉树、105.从前序与中序遍历序列构造二叉树

代码随想录算法训练营第十八天 | 513.找树左下角的值、112.路径总和、113.路径总和Ⅱ、106.从中序与后序遍历序列构造二叉树、105.从前序与中序遍历序列构造二叉树

叫我豆包就好了的博客 153

LeetCode热题100(31-40):算法面试核心突破指南

算法与数据结构是计算机科学的基础,其中动态规划、二叉树和回溯算法等技术在解决复杂问题时尤为关键。这些技术通过分治思想和状态管理,能有效提升程序执行效率,广泛应用于搜索引擎、推荐系统等场景。以LeetCode热题100中的31-40题为例,涵盖动态规划经典问题、二叉树操作等高频考点,是检验算法能力的试金石。掌握这些题目不仅能提升面试通过率,更能培养系统性解题思维。本文通过解析最长有效括号、组合总和等典型题目,结合栈应用、二分查找变种等热词,帮助开发者构建完整的算法知识体系。

weixin_34198453的博客 371

代码随想录算法训练营第十八天 | 513.找树左下角的值,112. 路径总和 113.路径总和ii,106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树

代码随想录算法训练营第十八天 | 513.找树左下角的值,112. 路径总和 113.路径总和ii,106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树

qq_41713240的博客 155

题解 | 桂林学院2023年天梯赛省赛专题训练【1队、2队】

博主很菜,只写出一道

奇妙方程式的博客 939

代码随想录算法训练营第四期第十八天 (十九天休息)| 513.找树左下角的值、112. 路径总和 113.路径总和ii、106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树

好了,补完昨天了,然而今天还没看...

qyy123ise的博客 307

LeetCode Hot100刷题指南:60天高效攻克算法面试

算法与数据结构是计算机科学的核心基础,其原理涉及时间复杂度优化、空间复杂度权衡等关键技术指标。掌握经典算法如动态规划、二叉树遍历不仅能提升代码效率,更是通过技术面试的关键能力。以LeetCode Hot100为代表的题库浓缩了硅谷大厂高频考点,通过系统化刷题可以建立算法思维模型。本文以动态规划状态转移、二叉树非递归遍历等典型问题为例,结合VS Code调试工具和Cornell笔记法,展示如何用60天时间高效掌握解题框架。特别适用于准备FAANG级别技术面试的开发者,涵盖亚马逊拓扑排序、谷歌并查集等企业特色题

weixin_33843409的博客 323

Isaac Lab 仿真对比指南:用 PXD2/OVD 逐帧校验 Isaac Gym 迁移后物理一致性

当把一套强化学习或控制仿真从 Isaac Gym 迁移到 Isaac Lab 时,最常见的疑虑不是"代码能不能跑",而是"两个环境的物理行为是否等价"。由于默认值解释、导入器对物体层级的处理、以及数值缩放方式都可能不同,肉眼或看训练曲线都无法给出确定答案。本篇指南给出一套可落地的比对方法:利用 PhysX 在两个平台上同源的引擎特性,分别录制 **PXD2**(Isaac Gym)与 **OVD*

gitblog_01168的博客 312

Leetcode 递归の简单题训练集合(687 783 938) python

Q-List687. 最长同值路径783. 二叉搜索树结点最小距离938. 二叉搜索树的范围和 687. 最长同值路径 我觉得这一题好难哇,看了题解写的,个人觉得还是有很多trick……之后还需要慢慢品 这里的“路径”只有两种情况,由父节点向左或向右,并没有父节点在路径中间的情况,评论中有人说有这种情况,但写个测试用例看看就知道其实是不存在这种情况的。 class Solution(object...

chutongz的博客 470

Day31:代码随想录算法训练营第三十一天|动态规划入门 1.力扣62 不同路径 2.力扣63 不同路径2

Day31:代码随想录算法训练营第三十一天|动态规划入门 1.力扣62 不同路径 2.力扣63 不同路径2

love_computer123的博客 553
上一篇: 【算法专题训练】30、二叉树的应用
下一篇: 【算法专题训练】32、二叉搜索树
Tim_10
博客等级 码龄2年 162粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值