我要成为算法高手-DFS篇

目录

  • 题目1:计算布尔二叉树的值
  • 题目2:求根节点到叶子结点数字之和
  • 题目3:二叉树剪枝
  • 题目4:验证二叉搜索树
  • 题目4:二叉搜索树中第 K 小的元素
  • 题目5:二叉树的所有路径

题目1:计算布尔二叉树的值

2331. 计算布尔二叉树的值 - 力扣(LeetCode)
在这里插入图片描述
在这里插入图片描述

思路:先递归左子树,再递归右子树,将左右子树递归的结果整合然后返回

class Solution {public boolean evaluateTree(TreeNode root) {if (root.left == null) {return root.val == 1 ? true : false;}//先计算左边的值boolean leftRet = evaluateTree(root.left);//再计算右边的值boolean rightRet = evaluateTree(root.right);       return root.val == 2 ? leftRet | rightRet : leftRet & rightRet;}
}

题目2:求根节点到叶子结点数字之和

129. 求根节点到叶节点数字之和 - 力扣(LeetCode)
在这里插入图片描述
在这里插入图片描述

思路:拿中间的某一个小的分支来分析,看看这一步要做什么,以及需要什么
在这里插入图片描述

当遍历到图中9这个结点,此时前缀和14是需要知道的,同时14和9相加之后的前缀和,也要交给9结点的左右孩子,计算左右子树的和,将左右子树与根节点的值整合之后,还要返回给4这个结点。因此设计递归函数的时候,参数需要TreeNode以及前缀和,返回值是数字之和

class Solution {public int sumNumbers(TreeNode root) {return dfs(root, 0);//根节点,前缀的和为0}public int dfs(TreeNode root, int preSum) {if (root == null) {return 0;}preSum = preSum * 10 + root.val;// 更新前缀和// 如果是叶子结点,直接返回更新后的前缀和if (root.left == null && root.right == null) {return preSum;}int ret = 0;// 计算左边的和if (root.left != null) {ret += dfs(root.left, preSum);}// 计算右边的和if (root.right != null) {ret += dfs(root.right, preSum);}return ret;}
}

题目3:二叉树剪枝

814. 二叉树剪枝 - 力扣(LeetCode)
在这里插入图片描述
在这里插入图片描述

题目说人话就是:把结点的值全是0的子树给干掉

思路:先处理左子树,再处理右子树,最后返回根结点,如何处理?当遍历到叶子结点时,并且这个叶子结点的值是0,就把这个结点置空,置空后返回,递归的出口:当root为空

class Solution {public TreeNode pruneTree(TreeNode root) {return dfs(root);}private TreeNode dfs(TreeNode root) {if (root == null) {return null;}root.left = dfs(root.left);// 左子树处理完之后的值赋值给左结点root.right = dfs(root.right);// 右子树处理完之后的值赋值给右结点if (root.left == null && root.right == null && root.val == 0) {root = null;return root;}return root;}
}

题目4:验证二叉搜索树

98. 验证二叉搜索树

在这里插入图片描述

关于二叉搜索树有一个结论:二叉搜索树中序遍历的结果是有序的,所以我们可以采取中序遍历的方法,另外定义一个全局变量prev,表示遍历到某一个结点的前驱的值,此时只需比较当前结点的值和这个prev的大小就能知道是否符合二叉搜索树的要求。此外递归过程中,可以进行剪枝,如果左子树都不是二叉搜索树,那么这整个树都不是二叉搜索树,因此右子树就不需要再去递归了,可以直接返回

class Solution {private long prev = Long.MIN_VALUE;public boolean isValidBST(TreeNode root) {return dfs(root);}private boolean dfs(TreeNode root) {if (root == null) {return true;}// 递归左子树boolean l = dfs(root.left);// 剪枝if (l == false) {return false;}// 根boolean cur = false;if (prev < root.val) {cur = true;prev = root.val;}// 剪枝if (cur == false) {return false;}// 递归右子树右boolean r = dfs(root.right);return l && cur && r;}
}

题目4:二叉搜索树中第 K 小的元素

230. 二叉搜索树中第 K 小的元素
在这里插入图片描述

定义两个全局变量,count、ret,count初始值为k,同样的我们采用中序遍历,遍历完结点count就-1,当count为0时,此时当前的结点就是目标值,把这个结点的值赋值给ret然后返回即可

class Solution {int count = 0;int ret  = 0;public int kthSmallest(TreeNode root, int k) {        count = k;dfs(root);return ret;}public void dfs(TreeNode root) {if(root==null||count==0) {return;}//中序遍历//左dfs(root.left);count--;if(count==0) {//如果count=0,说明当前根节点是目标值ret = root.val;        return;}//右dfs(root.right);}
}

题目5:二叉树的所有路径

257. 二叉树的所有路径

在这里插入图片描述

思路:
在这里插入图片描述

另外注意一点,如果使用String作为PATH,后续会频繁的进行字符串拼接操作,比较耗时,可以使用StringBuffer

class Solution {List<String> ret = new ArrayList<String>();public List<String> binaryTreePaths(TreeNode root) {StringBuffer sb = new StringBuffer("");dfs(root, sb);return ret;}public void dfs(TreeNode root, StringBuffer PATH) {if(root==null) {return;}StringBuffer path = new StringBuffer(PATH);if (root.left == null && root.right == null) {            path.append(Integer.toString(root.val));ret.add(path.toString());return;}// path += root.val+"->";path.append(Integer.toString(root.val));path.append("->");dfs(root.left,path);dfs(root.right,path);}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习threejs,使用FlyControls相机控制器

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.FlyControls 相机控制…

Life Long Learning(李宏毅)机器学习 2023 Spring HW14 (Boss Baseline)

1. 终身学习简介 神经网络的典型应用场景是,我们有一个固定的数据集,在其上训练并获得模型参数,然后将模型应用于特定任务而无需进一步更改模型参数。 然而,在许多实际工程应用中,常见的情况是系统可以不断地获取新数据,例如 Web 应用程序中的新用户数据或自动驾驶中的…

Multi-Agent如何设计

文章小结 研究背景和目的 在单一大语言模型长期主导人工智能领域的背景下&#xff0c;多智能体系统在对话任务解决中逐渐崭露头角。 虽然先前的研究已经展示了多智能体系统在推理任务和创造性工作中的潜力&#xff0c;但对于其在对话范式方面的局限性以及单个智能体的影响&am…

(即插即用模块-Attention部分) 四十四、(ICIP 2022) HWA 半小波注意力

文章目录 1、Half Wavelet Attention2、代码实现 paper&#xff1a;HALFWAVELET ATTENTION ON M-NET FOR LOW-LIGHT IMAGE ENHANCEMENT Code&#xff1a;https://github.com/FanChiMao/HWMNet 1、Half Wavelet Attention 传统的图像增强方法主要关注图像在空间域的特征信息&am…

SpringBoot+Lombok项目实体属性名xXxx格式,前端接收不到

问题解析 今天发现后端传给前端的实体类中&#xff0c;有属性为xXxxx格式的&#xff0c;前端也使用相同名称接收&#xff0c;结果却不显示值&#xff01;研究了一会发现接口请求回来后&#xff0c;原xXxxx的属性名&#xff0c;会被转为全小写。具体原因为&#xff1a;使用Lombo…

Spring Boot教程之五十五:Spring Boot Kafka 消费者示例

Spring Boot Kafka 消费者示例 Spring Boot 是 Java 编程语言中最流行和使用最多的框架之一。它是一个基于微服务的框架&#xff0c;使用 Spring Boot 制作生产就绪的应用程序只需很少的时间。Spring Boot 可以轻松创建独立的、生产级的基于 Spring 的应用程序&#xff0c;您可…

网络安全——常用语及linux系统

一、网络安全概念及法规 网络安全&#xff1a;网络空间安全 cyber security 信息系统&#xff1a;由计算机硬件、网络和通信设备、计算机软件、信息资源、信息用户和规章制度组成的已处理信息流为目的的人机一体化系统 信息系统安全三要素&#xff08;CIA&#xff09; 保密…

Windows 正确配置android adb调试的方法

下载适用于 Windows 的 SDK Platform-Tools https://developer.android.google.cn/tools/releases/platform-tools?hlzh-cn 设置系统变量&#xff0c;路径为platform-tools文件夹的绝对路径 点击Path添加环境变量 %adb%打开终端输入adb shell 这就成功了&#xff01;

如何优化Elasticsearch大文档查询?

记录一次业务复杂场景下DSL优化的过程 背景 B端商城业务有一个场景就是客户可见的产品列表是需要N多闸口及各种其它逻辑组合过滤的&#xff0c;各种闸口数据及产品数据都是存储在ES的(有的是独立索引&#xff0c;有的是作为产品属性存储在产品文档上)。 在实际使用的过程中&a…

使用 WPF 和 C# 将纹理应用于三角形

此示例展示了如何将纹理应用于三角形,以使场景比覆盖纯色的场景更逼真。以下是为三角形添加纹理的基本步骤。 创建一个MeshGeometry3D对象。像往常一样定义三角形的点和法线。通过向网格的TextureCoordinates集合添加值来设置三角形的纹理坐标。创建一个使用想要显示的纹理的 …

探索 Transformer²:大语言模型自适应的新突破

目录 一、来源&#xff1a; 论文链接&#xff1a;https://arxiv.org/pdf/2501.06252 代码链接&#xff1a;SakanaAI/self-adaptive-llms 论文发布时间&#xff1a;2025年1月14日 二、论文概述&#xff1a; 图1 Transformer 概述 图2 训练及推理方法概述 图3 基于提示的…

Android Studio历史版本包加载不出来,怎么办?

为什么需要下载历史版本呢&#xff1f; 虽然官网推荐使用最新版本&#xff0c;但是最新版本如果自己碰到问题&#xff0c;根本找不到答案&#xff0c;所以博主这里推荐使用历史版本&#xff01;&#xff01;&#xff01; Android Studio历史版本包加载不出来&#xff1f; 下…

citrix netscaler13.1 重写负载均衡响应头(基础版)

在 Citrix NetScaler 13.1 中&#xff0c;Rewrite Actions 用于对负载均衡响应进行修改&#xff0c;包括替换、删除和插入 HTTP 响应头。这些操作可以通过自定义策略来完成&#xff0c;帮助你根据需求调整请求内容。以下是三种常见的操作&#xff1a; 1. Replace (替换响应头)…

STM32 FreeRTOS移植

目录 FreeRTOS源码结构介绍 获取源码 1、 官网下载 2、 Github下载 源码结构介绍 源码整体结构 FreeRTOS文件夹结构 Source文件夹结构如下 portable文件夹结构 RVDS文件夹 MemMang文件夹 FreeRTOS在基于寄存器项目中移植步骤 目录添加源码文件 工程添加源码文件 …

[Qt]常用控件介绍-按钮类控件-QPushButton、QRedioButton、QCheckBox、QToolButton控件

目录 1.QPushButton按钮 介绍 属性 Demo&#xff1a;键盘方向键控制人物移动 2.Redio Button按钮 属性 clicked、pressed、released、toggled区别 单选按钮的分组 Demo&#xff1a;点餐小程序 3.CheckBox按钮 属性 Demo&#xff1a;获取今天的形成计划 4.ToolBu…

SpringBoot链接Kafka

一、SpringBoot生产者 &#xff08;1&#xff09;修改SpringBoot核心配置文件application.propeties, 添加生产者相关信息 # 连接 Kafka 集群 spring.kafka.bootstrap-servers192.168.134.47:9093# SASL_PLAINTEXT 和 SCRAM-SHA-512 认证配置 spring.kafka.properties.securi…

zerotier搭建虚拟局域网,自建planet

基于该开源项目 自建planet节点&#xff0c;更快速&#xff0c;更安全 本教程依据docker-zerotier-planet 项目文档书写&#xff0c;并以linux(centos 7)和windows作为示例&#xff0c;需要其他系统配置方法&#xff0c;可移步项目文档 一. 前置资源 具有外网ip的服务器 后面…

计算机网络 (44)电子邮件

一、概述 电子邮件&#xff08;Electronic Mail&#xff0c;简称E-mail&#xff09;是因特网上最早流行的应用之一&#xff0c;并且至今仍然是因特网上最重要、最实用的应用之一。它利用计算机技术和互联网&#xff0c;实现了信息的快速、便捷传递。与传统的邮政系统相比&#…

《机器学习》——DBSCAN算法

文章目录 DBSCAN算法简介DBSCAN算法原理核心概念聚类过程 DBSCAN模型模型API主要参数其他参数 DBSCAN算法实例实例步骤导入所需库导入数据文件传入变量DBSCAN聚类分析添加数据进原数据框对聚类结果进行评分 DBSCAN算法简介 DBSCAN&#xff08;Density - Based Spatial Cluster…

【2024年华为OD机试】 (C卷,100分)- 用连续自然数之和来表达整数(Java JS PythonC/C++)

一、问题描述 题目描述 一个整数可以由连续的自然数之和来表示。 给定一个整数&#xff0c;计算该整数有几种连续自然数之和的表达式&#xff0c;且打印出每种表达式。 输入描述 一个目标整数T (1 <T< 1000) 输出描述 该整数的所有表达式和表达式的个数。 如果有…