根到叶路径问题:遍历框架 + 前中后序位置 + 路径记录 + 叶子节点处理

根到叶路径问题

    • 257. 二叉树的所有路径
    • 129. 求根节点到叶节点数字之和
    • 112. 路径总和
    • 113. 路径总和 II
    • 437. 路径总和 III
    • 988. 从叶结点开始的最小字符串
    • 124. 二叉树中的最大路径和

257. 二叉树的所有路径

问题描述:找出所有从根节点到叶子节点的路径,并以字符串形式返回每条路径。

题目链接:https://leetcode.cn/problems/binary-tree-paths/

解题思路:

  1. 遍历二叉树:遍历整棵树以访问每个节点。这是解决问题的基础,确保每个节点都被检查以构造路径。

  2. 记录路径:在遍历过程中,需要记录从根节点到当前节点的路径。

    通过一个列表或字符串来实现,每访问一个节点,就将该节点的值添加到路径中。

  3. 识别叶子节点:叶子节点是没有子节点的节点。

    当遇到叶子节点时,意味着找到了一条完整的路径,因为路径是从根节点到叶子节点的。

  4. 保存路径:一旦到达叶子节点,就将当前记录的路径保存下来。

    将路径添加到一个结果列表中,因为题目要求列出所有这样的路径。

  5. 回溯:在遍历二叉树时,每当从一个节点返回到它的父节点时,需要从当前路径中移除这个节点。

    当探索完一个节点的所有子节点后,我们需要回溯以探索同一父节点的其他子节点(如果有的话),这时当前节点不应该出现在新的路径中。

整个逻辑链条是:DFS允许我们从根节点开始,深入每个分支,直到到达叶子节点,然后保存路径,并回溯删除已添加的结果路径,探索其他分支。

DFS 代码框架:

void dfs(TreeNode root) {      # 遍历二叉树
    if (root == null) return;  # 最基础的情况
    dfs(root.left);            # 进入左子树
    dfs(root.right);           # 进入右子树   
}

前中后序位置:

void dfs(TreeNode root) {
    if (root == null) return; 
    //【前序位置】: 进入节点前做
    dfs(root.left);       
    //【中序位置】: 左子树都遍历完,即将开始遍历右子树的时候执行
    dfs(root.right);      
    //【后序位置】: 离开右节点(收集完该节点所有子树的信息)后做,在回溯到其父节点之前执行的(返回到它的父节点继续之前的遍历过程,继续执行父节点处的递归调用的下一步)
}

在这里插入图片描述

对于这题:

  • 如果单独抽出一个二叉树节点,它需要做什么事情?
  • 需要在什么时候(前/中/后序位置)做?
  1. 节点需要做的事情?
  • 记录路径:每个节点在路径中的位置需要被记录下来。

  • 判断是否为叶子节点:如果一个节点是叶子节点(即没有左右子节点),那么它就代表一条完整的路径的终点。

    这时,我们需要把当前构建的路径保存起来,因为这条路径是完整的,从根节点到叶子节点的路径。

  • 路径回溯:在完成对当前节点及其子树的遍历后,我们需要回溯。也就是说,在返回到父节点之前,当前节点应该从路径中移除,以便正确地构建其他的路径。

  1. 在什么时候做?
  • 记录路径(前序位置):在遍历到一个节点之前,我们应该把这个节点加入到当前路径中。这是因为无论这个节点最后是否成为一条完整路径的一部分,我们都需要先记录下它的值。这个操作适合在前序位置做,即在递归地探索左右子节点之前。

  • 判断是否为叶子节点(前序位置)

  • 路径回溯(后序位置):在完成了当前节点的所有子节点的遍历后(找到了一条路径),即在递归函数返回到父节点之前,我们应该从路径中移除当前节点。

    在添加完一条路径后,我们需要回溯,以便探索树中的其他路径。

    这意味着,当递归调用完成并且准备返回其父节点时,我们从path中移除当前节点。

    这一步是关键的,它恢复了path到父节点状态,从而为探索父节点的其他子节点(例如从左子树转向右子树)准备好了环境。

    当我们从path中移除一个节点,实际上是在进行路径的回溯,而不是直接移除一条完整路径。

    这个回溯(撤销之前的选择)步骤确保了每当我们回到一个分支点(如一个有两个子节点的父节点),path都能正确地反映出当前探索的路径。

    在这里插入图片描述
    回溯,就是回退一步。

完整代码:

class Solution:
    def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
        # 初始化遍历,启动深度优先搜索
        self.traverse(root)
        return self.res

    path = []  # 用于暂存当前路径的节点值
    res = []  # 存储所有从根到叶的路径

    def traverse(self, root: Optional[TreeNode]) -> None:
        if not root:  # 基底情况:节点为空,直接返回
            return
        
        # 叶子节点判断:左右子节点均为空
        if not root.left and not root.right:
            self.path.append(str(root.val))  # 添加当前节点值到路径
            self.res.append("->".join(self.path))  # 路径转换为字符串并存储
            self.path.pop()  # 回溯,从路径中移除当前叶子节点
            return
        
        self.path.append(str(root.val))  # 做选择,添加当前节点值到路径(前序遍历操作)
       
        self.traverse(root.left)
        self.traverse(root.right)
        
        self.path.pop()  # 撤销选择(回溯),从路径中移除当前节点(后序遍历操作)

129. 求根节点到叶节点数字之和

问题描述:计算从根节点到叶子节点生成的所有数字之和。这里每条路径代表一个数字,由该路径上的节点值依次连接而成。

题目链接:https://leetcode.cn/problems/sum-root-to-leaf-numbers/description/

257题解法:通过深度优先搜索遍历树,记录遍历过程中从根到当前节点的路径。遇到叶子节点时,将这条路径作为一个字符串添加到结果列表中。

129题解法:同样使用深度优先搜索遍历树,但是在遍历过程中,将从根到当前节点形成的数字累加起来。遇到叶子节点时,将累加得到的数字加到总和中。

这题比上一题多了一个特征:数字的累加。

class Solution:
    def sumNumbers(self, root: Optional[TreeNode]) -> int:
        self.totalSum = 0
        self.numberPath = []  # 用于模拟构建路径数字的过程
        self.traverse(root)
        return self.totalSum

    def traverse(self, root: Optional[TreeNode]) -> None:
        if not root:
            return
        
        # 添加当前节点值到路径数字中(模拟数字的构建)
        self.numberPath.append(root.val)
        
        # 如果是叶子节点,计算当前路径数字并累加到总和中
        if not root.left and not root.right:
            self.totalSum += int(''.join(map(str, self.numberPath)))
        
        self.traverse(root.left)
        self.traverse(root.right)
        
        # 撤销选择(回溯):移除路径数字的最后一个元素(模拟撤销数字的最后一位)
        self.numberPath.pop()

112. 路径总和

问题描述:判断在给定的二叉树中是否存在一条从根节点到叶子节点的路径,这条路径上所有节点值相加等于给定的数。

题目链接:https://leetcode.cn/problems/path-sum/description/

113. 路径总和 II

437. 路径总和 III

988. 从叶结点开始的最小字符串

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/451099.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ATFX汇市:美国2月CPI数据来袭,高通胀问题或进一步缓解

ATFX汇市:今日20:30,美国劳工部将公布2月未季调核心CPI年率数据,前值为3.9%,预期值3.7%,预期将下降0.2个百分点。历史数据看,美国核心CPI年率处于快速下降状态,去年3月份数据仍高达5.6%&#xf…

社交创新的先锋:探秘Facebook背后的故事与智慧

起源与初创阶段 Facebook的故事始于2004年,由马克扎克伯格(Mark Zuckerberg)、埃迪华索伦(Eduardo Saverin)、安德鲁麦克卡拉姆(Andrew McCollum)、克里斯休斯(Chris Hughes&#x…

prometheus 原理(架构,promql表达式,描点原理)

大家好,我是蓝胖子,提到监控指标,不得不说prometheus,今天这篇文章我会对prometheus 的架构设计,promql表达式原理和监控图表的绘图原理进行详细的解释。来让大家对prometheus的理解更加深刻。 架构设计 先来看看&am…

Vue3全家桶 - Vue3 - 【4】侦听器

侦听器 一、 组合式API: 1.1 watch()函数 创建侦听器: 语法:// 先导入 watch 函数 import { watch } from vue watch(source, callback, options)source: 需要侦听的数据源,可以是 ref(包括计算属性)、一个响应式对…

从监控到稳定性可观测:从问题响应到预防的技术变革

从单体架构到集群架构再到微服务架构,业务越来越庞大,也越来越复杂。每一次架构的升级,在提升了业务吞吐量的同时,必然会带来更大的复杂度。云原生时代背景下,微服务、Service Mesh、 Serverless 等新技术的出现&#…

sql面试题21:营销带货销量分析

题目大概意思: 找出网红带来的订单号和销售额(销售额是该订单的,比如凑单),满足是优惠码是1的,B类商品 数据表两个,分别是订单和品类 CREATE TABLE 订单 (订单号 VARCHAR(512),商品号 VARCH…

LED线性恒流控制芯片两段/三段开关调光/调色:SM2223E

LED线性恒流控制芯片的开关调光/调色功能可以通过以下两种方式实现: LED线性恒流控制芯片的开关调光/调色功能 1. 两段调光/调色:通过开启或关闭电源开关,可以调节LED灯的亮度或色温,从而改变输出电流的大小。这种方式适用于需要…

Redis及其数据类型和常用命令(一)

Redis 非关系型数据库,不需要使用sql语句对数据库进行操作,而是使用命令进行操作,在数据库存储时使用键值对进行存储,应用场景广泛,一般存储访问频率较高的数据。 一般关系型数据库(使用sql语句进行操作的…

ChatGPT引领智能对话:微信小程序的新潮玩法

1.引言 ChatGPT是由OpenAI开发的基于深度学习的自然语言处理模型,它在人工智能领域具有重要的影响力。ChatGPT基于大规模的文本数据进行训练,能够生成高质量的自然语言文本,包括对话、文章等。它的影响力主要体现在以下几个方面:…

系统及其分类

系统定义 系统:指若干相互关联的事物组合而成的具有特定功能的整体。 系统的基本作用:对输入信号进行加工和处理,将其转换为所需要的输出信号。 系统分类 系统的分类错综复杂,主要考虑其数学模型的差异来划分不同类型。主要分为…

【HarmonyOS】鸿蒙开发之工具安装与工程项目简介——第1章

鸿蒙开发工具包下载与使用 鸿蒙开发工具包下载 下载deveco studio开发工具包 系统要求: Windows 操作系统:Windows 10/11 64 位 内存:8GB 及以上 硬盘:100GB 及以上 分辨率:1280*800 像素及以上macOS 操作系统:mac…

leetcode代码记录(有序数组两数之和

目录 1. 题目:2. 我的代码:小结: 1. 题目: 给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。 函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numb…

【办公类-22-13】周计划系列(5-5)“周计划-05 上传周计划png“ (2024年调整版本)

作品展示——将docx 转PDF转png,保留第一张图片 背景需求: 把周计划内容初步替换后,获得了19周的周计划教案的docx 需要把周计划第一页的反思内容删除,,然后把第一页横版截图上传班级主页。 需求:周计划do…

开机一直提示dll文件缺失的修复方法,轻松解决弹窗dll问题

当我们在启动计算机并进入操作系统的过程中,如果遇到了开机即刻弹出窗口提示“dll文件缺失”的情况,这究竟是怎么一回事呢?首先,我们需要理解“dll”是Dynamic Link Library(动态链接库)的缩写,…

智海Mo 平台与 Datawhale 携手浙江大学,共襄 AI+X 高校行!

2024年3月9日,一场以"AIX 高校行"为主题的活动在浙江大学成功举办。本次活动由 Datawhale 与杭州市人工智能学会主办,浙江大学人工智能研究所、浙江大学控制科学与工程学院联合主办,浙江大学学生人工智能协会承办,趋动云…

49、东北大学、阿尔伯塔大学:MVS-GCN多视角脑区、具有先验脑结构学习的图模型[GCN六元理论识别所有EEG!]

本文由东北大学医学图像智能计算教育部重点实验室&#xff0c;加拿大阿尔伯塔大学于2022年1.19日发表于<Computers in Biology and Medicine> JCR\IF: Q1\7.7 Abstract&#xff1a; 目的:近年来&#xff0c;脑功能网络(FBN)已被用于神经系统疾病的分类&#xff0c;如自…

【nvm】下载安装,管理 node

nvm管理node 一. 阐述二. 需求三. nvm3.1 下载3.2 安装3.3 验证是否安装成功 四. 重启电脑五. 管理成功六. 报错6.1 nvm安装后node无效&#xff08;nvm入手&#xff0c;解决nvm use 不成功问题&#xff09;6.2 安装nvm后node无效&#xff08;node版本入手&#xff0c;直接替换更…

Kubeadm部署K8s

Kubeadm部署K8s 集群规划&#xff1a; Master节点规划: Node节点规划: 安装要求 在开始之前&#xff0c;部署Kubernetes集群机器需要满足以下几个条件&#xff1a; 操作系统 CentOS7.x-86_x64 硬件配置&#xff1a;2GB或更多RAM&#xff0c;2个CPU或更多CPU&#xff0c;硬盘…

Capture One 23:光影魔术师,细节掌控者mac/win版

Capture One 23&#xff0c;不仅仅是一款摄影后期处理软件&#xff0c;它更是摄影师们的得力助手和创意伙伴。这款软件凭借其卓越的性能、丰富的功能和前沿的技术&#xff0c;为摄影师们带来了前所未有的影像处理体验。 Capture One 23 软件获取 Capture One 23以其强大的色彩…

rt-thread组件之audio组件(结合wavplayer包使用)

前言 继上一篇RT-Thread组件之Audio框架i2s驱动的编写&#xff0c;应用层使用rt-thread软件包里面的wavplayer组件使用过程中wavplayer版本和rt-thread 5.0版本出现一个小的版本不兼容问题,这里做个记录 wavplayer软件包 问题出现的地方 源码应该修改为 版本对比