LeetCode-DFS-树类-简单难度

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

二叉树前中后序遍历模板

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

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

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

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

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.mfbz.cn/a/599055.html

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

相关文章

蓝桥杯备赛(填空题)【Python B组】

一、弹珠堆放 问题描述 小蓝有 20230610 颗磁力弹珠,他对金字塔形状尤其感兴趣,如下图所示: (图是盗来的啊,侵权请联系删除) 问题分析 找规律,第一层1个,第二层3个,第…

预定类小程序源码搭建包含各行业+源码开源可二开+详细图文搭建部署教程

在数字化浪潮席卷的今天,各行各业都急需找到与顾客连接的新方式。为了满足这一需求,很多店铺和企业都推出了预定类小程序,分享一款开源版预订类小程序源码,一站式解决方案,覆盖餐饮、旅游、美容、医疗、教育等多个行业…

《架构思维:从程序员到CTO》:通往顶级架构师之路

💂 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】🤟 一站式轻松构建小程序、Web网站、移动应用:👉注册地址🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交…

让我们把Domino变成SFTP服务器

大家好,才是真的好。 远程共享文件有很多办法,其中值得注意的是SFTP方式。SFTP即SSH文件传输协议,通过使用SSH传输层,SFTP可以通过Internet连接安全地访问和移动大量数据文件。 今天我们就介绍使用Domino中的HTTP OSGI方式来实现…

智慧监测IN!计讯物联筑牢高速滑坡预警“安全锁”

在现代社会,高速公路以其高速、便捷的特性,早已成为连接城市与地区之间的重要纽带,承载着日益增长的车流和人流。然而,随着车流量的激增,高速公路面临的运营压力和安全挑战也随之加大,其中滑坡风险尤为突出…

软考中级-软件设计师(十)网络与信息安全基础知识

一、网络概述 1.1计算机网络的概念 计算机网络的发展:具有通信功能的单机系统->具有通信功能的多机系统->以共享资源为目的的计算机网络->以局域网及因特网为支撑环境的分布式计算机系统 计算机网络的功能:数据通信、资源共享、负载均衡、高…

Echarts柱状图横坐标不显示

本人遇到的问题:折线图横坐标可以正常显示 柱状图接收一样的数据在横坐标却显示不了 1.在前端打印是否能够正常接收数据、数据类型是否有误以及数据是否有内容 console.log(typeof optionbar.xAxis.data)console.log(optionbar.xAxis.data) 2.如上确定能够接收到数…

ue引擎游戏开发笔记(32)——为游戏添加新武器装备

1.需求分析: 游戏中角色不会只有一种武器,不同武器需要不同模型,甚至可能需要角色持握武器的不同位置,因此需要添加专门的武器类,方便武器后续更新,建立一个武器类。 2.操作实现: 1.在ue5中新建…

艺术的新领域——探索元宇宙艺术展带来的沉浸式艺术体验

在数字化的浪潮中,元宇宙艺术展成为了一种全新的展览形式,它通过虚拟现实、3D建模技术和互动平台,将传统艺术与现代科技巧妙结合,提供了一种前所未有的艺术欣赏方式。此类展览不仅展示了艺术作品的新颖呈现,还为参观者…

翻译《The Old New Thing》 - Understanding the consequences of WAIT_ABANDONED

Understanding the consequences of WAIT_ABANDONED - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20050912-14/?p34253 Raymond Chen 2005年09月12日 理解 WAIT_ABANDONED 的后果 简要 文章讨论了在多线程同步中,如果一个线程…

【贪心算法】最小生成树Kruskal算法Python实现

文章目录 [toc]问题描述最小生成树的性质证明 Kruskal算法Python实现时间复杂性 问题描述 设 G ( V , E ) G (V , E) G(V,E)是无向连通带权图, E E E中每条边 ( v , w ) (v , w) (v,w)的权为 c [ v ] [ w ] c[v][w] c[v][w]如果 G G G的一个子图 G ′ G^{} G′是…

中国居民消费新特征:中枢回落,即时满足,去地产化

随着收入预期和财富效应的转变,居民更倾向于通过短期集中式的消费来获得即时满足的快乐,服务消费表现出了更强的韧性。服务消费强于商品消费、消费去地产化、汽车挑大梁的特征延续。 特征一:消费倾向高于2020-22年,低于2017-19年…

AI技术赋能下的视频监控方案是如何解决新能源汽车充电难问题的?

一、方案背景 刚刚结束的第十八届北京车展异常火爆,其中一组与汽车有关的数字让人格外关注。根据乘联会2024年4月19日公布的最新数据,全国乘用车市场零售达到51.6万辆,其中新能源车的销量约为26万辆,市场渗透率达到50.39%。 这意味…

如何让CANoe或Wireshark自动解析应用层协议

当我们使用CANoe软件或Wireshark工具抓取以太网总线上的报文时,网卡首先会把以太网总线上的模拟信号解析成以太网帧数据。数据链路层根据二层头部中的Type字段值确定上层的协议。 如果以太网使用的是TCP/IP协议栈,那么Type值要么是0x0800(IPv4),要么是0x0806(ARP),要么是0x…

SOL链DApp智能合约代币质押挖矿分红系统开发

随着区块链技术的不断发展和普及,越来越多的项目开始探索基于区块链的去中心化应用(DApp)。Solana(SOL)作为一条高性能、低成本的区块链网络,吸引了众多开发者和项目,其中包括了各种类型的DApp&…

Ansible自动化工具模块调用与playbook编写

目录 一、Ansible工作机制与特点 (一)Ansible工作机制 1. 初始化与配置 2. 编写Playbook 3. 调用模块 4. 加密敏感数据 5. 执行Playbook 6. 收集执行结果 7. 错误处理与回滚 8. 反馈与报告 (二)Ansible 的主要特点包括…

信锐交换机简介及应用说明(1)

交换机关键参数及分类 1.线速 线速是指交换机的端口上每秒钟传输的bit数,单位为bps(bit per second,即每秒传输多少bit,一个bit也就是一个二进制数0或者1)。以我们常见的例子来说明的话,比如100M的网卡就…

ComfyUI中图像亮度/对比度/饱和度处理

用上面这个节点可以同时设置图片的亮度、对比度和饱和度。 【保姆级教程】一口气分享在ComfyUI中常用的30多种基本图像处理方式 更多好玩且实用AIGC工作流和节点 星球号:32767063 本期资料链接 往期学习资料 整理AI学习资料库

【容器】k8s获取的节点oom事件并输出到node事件

在debug k8s node不可用过程中,有可能会看到: System OOM encountered, victim process: xx为了搞清楚oom事件是什么,以及如何产生的,我们做了一定探索,并输出了下面的信息。(本文关注oom事件是如何生成&传输的&a…

uniapp的app端软件更新弹框

1:使用html PLUS实现:地址HTML5 API Reference (html5plus.org),效果图 2:在app.vue的onLaunch生命周期中,代码如下: onLaunch: function() {let a 0let view new plus.nativeObj.View(maskView, {backg…
最新文章