算法系列--递归(2)

💕"什么样的灵魂就要什么样的养料,越悲怆的时候我越想嬉皮。"💕
作者:Mylvzi
文章主要内容:算法系列–递归(2)
在这里插入图片描述

前言:今天带来的是算法系列--递归(2)的讲解,包含六个和二叉树相关的题目哦

1.计算布尔⼆叉树的值

链接: https://leetcode.cn/problems/evaluate-boolean-binary-tree/
在这里插入图片描述

分析:

  1. 函数头:传入节点,得到左右子树的值, boolean dfs(TreeNode root)
  2. 函数体:dfs(root.left); dfs(root.right)
  3. 递归出口:当遇到叶子结点的时候直接返回即可

代码:

class Solution {public boolean evaluateTree(TreeNode root) {// 函数头就是这样if(root.left == null) return root.val == 0 ? false : true;boolean left = evaluateTree(root.left);// 得到左子树的值boolean right = evaluateTree(root.right);// 得到右子树的值return root.val == 2 ? left | right : left & right;// 判断}
}

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

链接: https://leetcode.cn/problems/sum-root-to-leaf-numbers/
在这里插入图片描述

分析:
在这里插入图片描述

代码:

class Solution {public int sumNumbers(TreeNode root) {return dfs(root,0);}private int dfs(TreeNode root, int presum) {// 1.计算当前节点的值presum = presum * 10 + root.val;// 递归出口if(root.left == null && root.right == null) return presum;// 2.递归左子树int ret = 0;if(root.left != null) ret += dfs(root.left,presum);// 3.递归右子树if(root.right != null) ret += dfs(root.right,presum);// 4.返回左右子树的总和return ret;}
}

总结:
当一个递归函数不好想时,就去模拟一遍整个过程

比如本题,你要想想这个接口是干啥的,你想要这个接口帮你做什么–给接口一个根节点,你去给我算出左右子树的和,并且返回给我,那么就能确定出函数头;

  • 返回值:int类型,左子树 + 右子树的和
  • 函数名:dfs
  • 参数:root,还要给我走到当前节点的值,我只有知道这个值,才能和子节点相连

3.⼆叉树剪枝

链接: https://leetcode.cn/problems/binary-tree-pruning/description/

在这里插入图片描述

分析:

  • 明确接口的作用:给你一个根节点root,你去给我判断左右子树是否满足剪枝的条件,如果满足就断开和根节点的连接,如果不满足继续保持连接即可
  • 函数头:返回值应该是TreeNode,当条件满足时,需要断开连接,直接返回null就可以实现,如果条件不满足,还是需要返回子根节点;函数名dfs,参数需要通过一个根节点就行
  • 函数体:先分别遍历左右子树,更新root的左右子树的连接条件,接着判断是否满足剪枝的条件,如果满足,返回null,表示需要剪枝,如果不满足,返回当前的根节点即可
  • 递归出口:当节点为空时,直接返回null

代码:

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置为空return null;else return root;}
}

4. 验证⼆叉搜索树

链接: https://leetcode.cn/problems/validate-binary-search-tree/description/
在这里插入图片描述

分析:

本题要利用到二叉搜索树的一个性质–二叉搜索树的中序遍历的结果是一个有序序列

  • 明确接口的作用:给你一个根节点,你去给我判断一下左右子树是否都符合二叉搜索树的条件,如果不满足直接返回false,满足返回true
  • 函数头:返回值是boolean,参数需要提供一个根节点,函数名是dfs
  • 函数体:由于要中序遍历,所以应该先遍历左子树,判断左子树是否满足二叉搜索树,如果不满足,直接返回false即可(此时就没有遍历根节点和右子树的必要了),如果满足,判断当前根节点的状态是否满足二叉搜索树,具体的判断条件就是比较root.val和prev值的大小,如果root.val < prev,则不符合二叉搜索树的条件,直接返回false,如果root.val > prev,则符合二叉搜索树的条件,继续判断右子树是否符合条件,如果右子树满足,返回true,如果不满足,返回false
  • 递归出口:当节点为空时,返回true

在这里插入图片描述

代码:

class Solution {// 二叉搜索树的性质:中序遍历的结果是一个有序的序列long prev = Long.MIN_VALUE;// 设置为long是为了防止越界public boolean isValidBST(TreeNode root) {if(root == null) return true;// 空树也是二叉搜索树boolean left = isValidBST(root.left);if(left == false) return false;// 剪枝boolean cur = root.val > prev ? true : false;if(cur == false) return false;// 剪枝prev = root.val;// 更新prevboolean right = isValidBST(root.right);return right;}
}

5.⼆叉搜索树中第 k ⼩的元素

链接: https://leetcode.cn/problems/kth-smallest-element-in-a-bst/description/
在这里插入图片描述

分析:

本题还是利用二叉搜索树的性质:二叉搜索树的中序遍历的结果是一个有序序列

设计一个ret作为返回值,设计一个cnt计数器,让cnt的初始值为k,通过中序遍历,每遍历到一个节点就让cnt--,当cnt = 0是,将ret更新为cur.val,然后返回即可

代码:

class Solution {int cnt;int ret;public int kthSmallest(TreeNode root, int k) {cnt = k;dfs(root);return ret;}private void dfs(TreeNode root) {if(root == null || cnt == 0) return;dfs(root.left);cnt--;if(cnt == 0) ret = root.val;dfs(root.right);}
}

6.⼆叉树的所有路径

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

在这里插入图片描述

分析:

  • 明确接口的作用:给你一个根节点,给我拼接上左子树和右子树

  • 函数头: 需要提供一个根节点和走到当前节点之前已经拼接好的字符串(path)

  • 函数体:先创建出一个新的字符串用于接受path,接着以这个新的字符串为基准,遍历左子树和右子树

  • 递归出口:当root为叶子节点时,证明一个完整的二叉树路径已经被拼接完毕,让ret添加这个拼接完毕的字符串路径即可

代码:

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

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

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

相关文章

就业班 第二阶段 2401--3.21 day3 备份

一、逻辑备份 备份的是建表、建库、插入等操作所执行SQL语句&#xff0c;适用于中小型数据库&#xff0c;效率相对较低。 本质&#xff1a;导出的是SQL语句文件 优点&#xff1a;不论是什么存储引擎&#xff0c;都可以用mysqldump备成SQL语句 缺点&#xff1a;速度较慢&…

005——串口移植(基于鸿蒙liteos-a)

目录 一、 Liteos-a中串口的使用 1.1 内核里打印 1.2 APP控制台 ​编辑 1.2.1 /dev/console 1.2.2 /dev/serial 1.2.3 /dev/uartddev-0 1. 总体介绍 2. device_t 3. drvier_t 4. uartdev_fops 1.2.4 uart_ops 二、 鸿蒙串口内部的一些机制&#xff08;流水账&…

K8S node磁盘清理

K8S磁盘清理 K8S的部署形式相比传统非容器部署&#xff0c;会消耗更多的磁盘&#xff0c;在运行时可能会把磁盘占满。 这里以使用containerd运行时的K8S node为例&#xff0c;说明磁盘会用到那里了和如何清理磁盘 通用处理 磁盘清理: du -h --max-depth6 / 2>/dev/nul…

docker学习笔记 三-----docker安装部署

我使用的部署环境是centos 7.9 1、安装依赖工具 yum install -y yum-utils device-mapper-persistent-data lvm2 安装完成如下图 2、添加docker的软件信息源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo url地址为如…

QGraphicsView的使用,view坐标,scene坐标,item坐标

Graphics View绘图构架 QGraphicsScene&#xff08;场景&#xff09;&#xff1a;可以管理多个图形项QGraphicsItem&#xff08;图形项&#xff09;&#xff1a;也就是图元&#xff0c;支持鼠标事件响应。QGraphicsView&#xff08;视图&#xff09;&#xff1a;关联场景可以让…

数据科学详解与人工智能关系

一、数据科学是什么 数据科学是一个混合交叉学科&#xff0c;它涉及数学、统计学、计算机科学和领域知识&#xff0c;旨在从数据中提取有意义的信息和知识。数据科学家利用各种技术和工具来收集、处理、分析和解释大量的数据&#xff0c;以便为组织和企业做出决策和预测。数据科…

Vue3:路由组件的props用法

一、情景说明 路由组件间&#xff0c;传递参数时&#xff0c;更优雅的写法 Vue3的写法和Vue2的写法基本相似&#xff0c;就是接收参数的组件&#xff0c;略有不同 Vue2的写法&#xff1a;https://blog.csdn.net/Brave_heart4pzj/article/details/136283870 二、案例 1、传参…

canvas跟随鼠标移动画带透明度的线

提示&#xff1a;canvas画线 文章目录 前言一、带透明度的线二、试错&#xff0c;只有lineTo的时候画&#xff0c;只有最后地方是透明度的三、试错&#xff0c;只存上一次的点&#xff0c;线会出现断裂的情况总结 前言 一、带透明度的线 test.html <!DOCTYPE html> &l…

小小知识点-produce, product, production.

produce做动词的意思就不多说了。主要区别这三个名词&#xff1a;produce, product, production.produce v.生产; 制造; 引起; 产生; 招致; 出示; 制作; 导演; 播放; 播送; 使(线段)延长&#xff1b;n.产品; 物产; 成果; 结果&#xff1b; product n. 作品; 产品; 积; 结果; 产…

Linux:执行命令的命令eval与Bash解析命令的方式

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 eval命令用于接收参数&#xff0c;并将这些参数作为一行命令执行&#xff0c;这也许会使人困惑&#xff0c;为什么我不能直接执行命令而需要使用eval命令间接执行呢&…

看了一篇开源作者文章我沉默了良久还是发一篇心情文章

开源框架 NanUI 项目宣布将暂停开发&#xff0c;作者转行卖钢材的新闻让我心生悲意&#xff0c;开源作者生存现状很多人并不了解&#xff0c;在开源社区里能赚到钱的毕竟是少数丛林法则在开源社区同样适用&#xff0c;看了开源框架 NanUI 项目宣布将暂停开发&#xff0c;作者转…

MySQL数据库事务介绍

前言 在MySQL数据库中&#xff0c;事务&#xff08;Transaction&#xff09;是指一组SQL语句的执行序列&#xff0c;这些SQL语句要么全部执行成功&#xff0c;要么全部执行失败&#xff0c;保证数据库的一致性和完整性&#xff1b;用于操作量大、复杂度高的数据。 目录 一、…

Python之Web开发中级教程----Django站点管理

Python之Web开发中级教程----Django站点管理 网站的开发分为两部分&#xff1a;内容发布和公共访问 内容发布是由网站的管理员负责查看、添加、修改、删除数据 Django能够根据定义的模型类自动地生成管理模块 使用Django的管理模块, 需要按照如下步骤操作 : 1.管理界面本地…

如何一键升级 package.json 下所有依赖的版本

要一键升级package.json下所有依赖的版本&#xff0c;你可以使用npm-check-updates这个工具。首先&#xff0c;你需要全局安装这个工具&#xff1a; npm install -g npm-check-updates安装完成后&#xff0c;运行以下命令来更新package.json文件中的所有依赖到最新版本&#x…

Deep Graph Representation Learning and Optimization for Influence Maximization

Abstract 影响力最大化&#xff08;IM&#xff09;被表述为从社交网络中选择一组初始用户&#xff0c;以最大化受影响用户的预期数量。研究人员在设计各种传统方法方面取得了巨大进展&#xff0c;其理论设计和性能增益已接近极限。在过去的几年里&#xff0c;基于学习的IM方法的…

数据库访问技术主要包括哪些?

数据库访问技术主要包括以下几种&#xff1a; SQL(Structured Query Language)&#xff1a; SQL是一种用于管理和操作关系型数据库的标准化语言。它包括数据查询(SELECT)、数据更新(INSERT、UPDATE、DELETE)、数据定义(CREATE、ALTER、DROP)、数据控制(GRANT、REVOKE)等功能。S…

面试 Java 基础八股文十问十答第十七期

面试 Java 基础八股文十问十答第十七期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;迭代器 Iterator 是什…

【BFS广度优先搜索专题】【蓝桥杯备考训练】:母亲的牛奶、走迷宫、八数码1、八数码2、全球变暖【已更新完成】

目录 1、母亲的牛奶&#xff08;usaco training 1.5&#xff09; 2、走迷宫&#xff08;模板&#xff09; 3、八数码1&#xff08;模板&#xff09; 4、八数码2&#xff08;《算法竞赛进阶指南》& HDU1043&#xff09; 5、全球变暖&#xff08;第九届蓝桥杯省赛C &…

企业如何利用数字工厂管理系统打造自动化产线

随着信息技术的飞速发展&#xff0c;数字化转型已成为企业提升生产效率、降低成本、优化管理的重要手段。数字工厂管理系统作为数字化转型的核心组成部分&#xff0c;其在打造自动化产线方面的作用日益凸显。本文将探讨企业如何利用数字工厂管理系统打造自动化产线&#xff0c;…

【QED】斐波那契游戏

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 总结 题目 题目链接&#x1f517; 斐波那契数列指的是这样一个数列&#xff1a;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8&#xff0c;13&#xff0c;21&#xff0c;34&#xff0c;55&#x…