LeetCode-DFS-树类-简单难度

news2025/4/5 15:28:52

关于二叉树的相关深度优先遍历类题目,重点在于掌握最基本的前中后序遍历,大多数题目都在围绕这套逻辑,找到处理节点的时机,以及停止遍历的条件,即可顺利完成。

二叉树前中后序遍历模板

所谓前中后序,指的就是访问节点的时机。

前序:访问当前节点->左子树->右子树

中序:左子树->访问当前节点->右子树

后序:左子树->右子树->访问当前节点

public void dfs(TreeNode root) {
    // 最终终止条件,彻底遍历完了
    if (root == null) {
        return;
    }
    // 前序 System.out.println(root.val);
    dfs(root.left);
    // 中序 System.out.println(root.val);
    dfs(root.right);
    // 后序 System.out.println(root.val);
}

下面来几道练习

1. 二叉树的最大深度

public int maxDepth(TreeNode root) {
    if(root == null){
        return 0;
    }
    int leftMaxDepth = maxDepth(root.left);
    int rightMaxDepth = maxDepth(root.right);
    return Math.max(leftMaxDepth, rightMaxDepth) + 1;
}

2. 二叉树的最小深度

1.如果左右子树都为空,则返回1。

2.优先遍历左右子树,如果左子树为空,则返回右子树的深度,如果右子树为空,则返回左子树的深度。

3.如果都不为空,则返回二者较小的一个。

能走到第2步则表示左右子树至少有一个是非空的,而最小深度只能从非空的子树中产生,所以左右子树哪个不是空,就找它,如果都不是空,就找最小的。

public int minDepth(TreeNode root) {
    if (root == null) {
        return 0;
    }
    if (root.left == null && root.right == null) {
        return 1;
    }
    int leftMinDepth = minDepth(root.left);
    int rightMinDepth = minDepth(root.right);
    if (root.left == null) {
        return rightMinDepth + 1;
    }
    if (root.right == null) {
        return leftMinDepth + 1;
    }
    return Math.min(leftMinDepth, rightMinDepth) + 1;
}

3. 路径总和

基于先序遍历进行处理即可,目标是将targetSum减到0同时满足当前为叶子节点。

public boolean hasPathSum(TreeNode root, int targetSum) {
    if(root == null){
        return false;
    }
    int x = targetSum - root.val;
    if(root.left == null && root.right == null && x == 0){
        return true;
    }
    return hasPathSum(root.left, x) || hasPathSum(root.right, x);
}

4. 二叉树的最近公共祖先

1.当前遍历到的节点是空,或者是p本身、或者是q本身,则应当返回当前节点

2.优先遍历左右子树

3.如果左右子树都不为空,则root自然就是它们的最近公共祖先,因此直接返回root

4.除此之外,如果左子树为空,则最近公共祖先一定在右子树中,否则就在右子树中

public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    if(root == null || root == p || root == q){
        return root;
    }
    TreeNode left = lowestCommonAncestor(root.left, p, q);
    TreeNode right = lowestCommonAncestor(root.right, p, q);
    if(left != null && right != null){
        return root;
    }
    return left != null ? left : right;
}

本题基于后序遍历进行处理,终止条件为当前节点为空,或者当前节点就是目标节点,所以如果左右子树都有返回值,则说明各自都找到目标节点,那最近公共祖先自然就是当前root节点。反之,如果左右子树都返回了空,则说明都没找到,那随便返回哪个都一样(因为无论哪个都是空)。另一类情况就是一个为空,一个不为空,言下之意就是,一个找到了目标值,一个未找到目标值,那自然得返回找到目标值的那一个,最后递归逻辑会带着其中一个返回的目标值,与另一个带着其中一个返回的目标值,命中左右子树都不为空的条件,即可返回root。

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

这题直接按照先序遍历的方式,根据当前节点的值先进行计算,如果当前节点是叶子节点,则直接返回计算结果,否则将计算结果带入左右子树继续计算。

public int sumNumbers(TreeNode root) {
    return dfs(root, 0);
}
public int dfs(TreeNode root, int sum){
    if(root == null){
        return 0;
    }
    int x = sum * 10 + root.val;
    if(root.left == null && root.right == null){
        return x;
    }
    return dfs(root.left, x) + dfs(root.right, x);
}

6. 二叉搜索树中第K小的元素

对于二叉搜索树,只需要按照中序遍历,即可从小到大进行输出,所以找到第K小的元素,实际上就是返回第K次访问的元素即可。

int cnt = 0;
int ans = -1;
public int kthSmallest(TreeNode root, int k) {
    dfs(root, k);
    return ans;
}
public void dfs(TreeNode root, int k){
    if(root == null || ans != -1){
        return;
    }
    dfs(root.left, k);
    if(++cnt == k){
        ans = root.val;
        return;
    }
    dfs(root.right, k);
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

好久不见,回来看看七年前的你

今天在网上搜东西,突然想到之前在网上记录的点滴成长,回来看看~ 来看看那些年走过的路,小伙还挺真实,有些想法~ 那时,一起在网上记录文字的人,也都慢慢失去了联系~ 确实,深有感触,…

【论文阅读笔记】MAS-SAM: Segment Any Marine Animal with Aggregated Features

1.论文介绍 MAS-SAM: Segment Any Marine Animal with Aggregated Features MAS-SAM:利用聚合特征分割任何海洋动物 Paper Code(空的) 2.摘要 最近,分割任何模型(SAM)在生成高质量的对象掩模和实现零拍摄图像分割方面表现出卓越…

超疏水TiO₂纳米纤维网膜的良好性能

超疏水TiO₂纳米纤维网膜是一种具有特殊性能的材料,它结合了TiO₂的光催化性能和超疏水表面的自清洁、防腐、防污等特性。这种材料在防水、自清洁、油水分离等领域具有广阔的应用前景。 制备超疏水TiO₂纳米纤维网膜的过程中,通过精确控制纺丝溶液的成分…

BFS Ekoparty 2022 -- Linux Kernel Exploitation Challenge

前言 昨天一个师傅给了我一道 linux kernel pwn 题目,然后我看了感觉非常有意思,题目也不算难(在看了作者的提示下),所以就花时间做了做,在这里简单记录一下。这个题是 BFS Lab 2022 年的一道招聘题&#…

【优选算法】——Leetcode——202—— 快乐数

目录 1.题目 2. 题⽬分析: 3.简单证明: 4. 解法(快慢指针): 算法思路: 补充知识:如何求⼀个数n每个位置上的数字的平⽅和。 总结概括 5.代码实现 1.C语言 2.C 1.题目 202. 快乐数 编写一个算法来…

国家电网某地电力公司网络硬件综合监控运维项目

国家电网某地电力公司是国家电网有限公司的子公司,负责当地电网规划、建设、运营和供电服务,下属多家地市供电企业和检修公司、信息通信公司等业务支撑实施机构。 项目现状 随着公司信息化建设加速,其信息内网中存在大量物理服务器、存储设备…

我独自升级崛起在哪下载 我独自升级崛起客户端下载教程

定于5月8日全球盛放的《我独自升级:崛起》——这一激动人心的动作角色扮演游戏巨作,汲取了同名动漫及网络漫画的精髓,誓将以其无与伦比的魅力,引领玩家迈入一个探索深远、规模宏大的奇幻之旅。游戏构筑在一个独一无二的网络武侠世…

英语学习笔记3——Sorry, sir.

Sorry, sir. 对不起,先生。 词汇 Vocabulary umbrella n. 伞,保护伞 注意读音 [ʌm’brelə] 英国人离不开雨伞。 please 请 特殊用法:让路(升调)      用餐礼仪(平调)      求求你…

【Toritoise SVN】SVN 怎么忽略文件夹下的所有文件但是不忽略文件夹本身

比如:忽略 Assets\StreamingAssets\LocalAsset文件夹下的所有文件但是不忽略LocalAsset这个文件夹 在TortoiseSVN中,你可以通过以下步骤来修改文件夹的svn:ignore属性: 打开Windows资源管理器,导航到你的工作副本中的Assets\Stre…

鸿蒙内核源码分析(互斥锁篇) | 互斥锁比自旋锁丰满多了

内核中哪些地方会用到互斥锁?看图: 图中是内核有关模块对互斥锁初始化,有文件,有内存,用消息队列等等,使用面非常的广.其实在给内核源码加注的过程中,会看到大量的自旋锁和互斥锁,它们的存在有序的保证了内核和应用程序的正常运行.是非常基础和重要的功能. 概述 自旋锁 和…

HIVE函数的基本使用

HIVE函数的基本使用 1.查看所有支持的函数 共289个 1)SHOW FUNCTIONS 查看所有支持的函数 共289个 2)SHOW FUNCTIONS LIKE "**" 模糊查询函数名 3)DESC FUNCTION 函数名 可以查看函数的具体使用方法 show functions; show functions like "*c…

【Python爬虫实战入门】:全球天气信息爬取

文章目录 一、爬取需求二、所需第三方库2.1 简介 三、实战案例四、完整代码 一、爬取需求 目标网站:http://www.weather.com.cn/textFC/hb.shtml 需求:爬取全国的天气(获取城市以及最低气温) 目标url:http://www.weath…

双热点的王炸组合!损失函数+Attention,精度与速度上实现SOTA!

损失函数注意力机制在深度学习领域是一个热门研究方向,它可以提高模型的性能和泛化能力,帮助我们构建更加精确且高效的模型。 具体来说: 通过结合注意力机制的聚焦能力和损失函数的优化指导,模型能够更精确地捕捉数据中的关键信息…

Vue3基础笔记(4)组件

目录 一.模版引用 二.组件组成 1.引入组件 2.注入组件 3.显示组件 三.组件嵌套关系 四.组件注册方式 五.组件传递数据 六.组件事件 一.模版引用 虽然Vue的声明性渲染模型为你抽象了大部分对DOM的直接操作,但在某些情况下,我们仍然需要直接访问底…

一个新细节,Go 1.17 将允许切片转换为数组指针!

在 Go 语言中,一个切片(slice)包含了对其支持数组的引用,无论这个数组是作为一个独立的变量存在于某个地方,还是仅仅是一个为支持分片而分配的匿名数组。 其切片基本结构都如下: // runtime/slice.go typ…

windows安装ElasticSearch以及踩坑

1.下载 elasticsearch地址:Past Releases of Elastic Stack Software | Elastichttps://www.elastic.co/cn/downloads/past-releases#elasticsearch IK分析器地址:infinilabs/analysis-ik: 🚌 The IK Analysis plugin integrates Lucene IK…

学习R语言第五天

文章目录 语法学习创建数据的方式绘制图形的方式图形添加颜色如何操作数据的方式数据进行验算的判断加付值的方式修改变量名称的方式判断是否存在缺失值在计算的方式忽略缺失值通过函数的方式忽略缺失值日期处理的方式字符串转化成日期的方式格式化数据框中数据返回当前的日期的…

【重磅开源】MapleBoot生成代码工具介绍(单表表格功能)

基于SpringBootVue3开发的轻量级快速开发脚手架 🍁项目简介 一个通用的前、后端项目模板 一个快速开发管理系统的项目 一个可以生成SpringBootVue代码的项目 一个持续迭代的开源项目 一个程序员的心血合集 度过严寒,终有春日&#xff…

【深度学习实战(33)】训练之model.train()和model.eval()

一、model.train(),model.eval()作用? model.train() 和 model.eval() 是 PyTorch 中的两个方法,用于设置模型的训练模式和评估模式。 model.train() 方法将模型设置为训练模式。在训练模式下,模型会启用 dropout 和 batch norm…

SinoDB SQL管理工具之-DBeaver安装使用说明

本文介绍如何使用DBeaver管理工具连接SinoDB数据库。 1. DBeaver下载 下载地址:Download | DBeaver Community 请根据需求选择对应自己操作系统的版本进行下载。本次示例使用Windows 64位操作系统进行安装配置。下载版本为:dbeaver-ce-23.0.2-x86_64-…