LeetCode669. 修剪二叉搜索树

669. 修剪二叉搜索树

文章目录

      • [669. 修剪二叉搜索树](https://leetcode.cn/problems/trim-a-binary-search-tree/)
        • 一、题目
        • 二、题解
          • 方法一:递归法
          • 方法二:迭代法


一、题目

给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在 唯一的答案

所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。

示例 1:

img

输入:root = [1,0,2], low = 1, high = 2
输出:[1,null,2]

示例 2:

img

输入:root = [3,0,4,null,2,null,null,1], low = 1, high = 3
输出:[3,2,null,1]

提示:

  • 树中节点数在范围 [1, 104]
  • 0 <= Node.val <= 104
  • 树中每个节点的值都是 唯一
  • 题目数据保证输入是一棵有效的二叉搜索树
  • 0 <= low <= high <= 104

二、题解

方法一:递归法

我们从根节点开始,逐个遍历树的节点,判断每个节点的值是否在给定的范围内。如果节点的值小于最小值(low),那么我们就需要修剪掉左子树,因为左子树的节点值都会更小,不可能在范围内。类似地,如果节点的值大于最大值(high),就需要修剪掉右子树。如果节点的值在范围内,我们保留这个节点,并分别递归修剪左子树和右子树。

下面是具体的算法思路以及解题步骤:

算法思路

  1. 如果树为空(即根节点为nullptr),直接返回nullptr,因为没有需要修剪的节点。
  2. 如果根节点的值小于最小值low,那么根节点以及左子树的所有节点都会小于low,所以我们需要修剪掉左子树,递归调用trimBST(root->right, low, high),返回修剪后的右子树作为新的根节点。
  3. 如果根节点的值大于最大值high,那么根节点以及右子树的所有节点都会大于high,所以我们需要修剪掉右子树,递归调用trimBST(root->left, low, high),返回修剪后的左子树作为新的根节点。
  4. 如果根节点的值在范围内,我们保留这个节点,并分别递归修剪左子树和右子树,即root->left = trimBST(root->left, low, high);root->right = trimBST(root->right, low, high);
  5. 最后返回修剪后的根节点。

具体实现

class Solution {
public:TreeNode* trimBST(TreeNode* root, int low, int high) {if(root == nullptr) return nullptr;if(root->val < low){return trimBST(root->right, low, high);}if(root->val > high){return trimBST(root->left, low, high);}root->left = trimBST(root->left, low, high);root->right = trimBST(root->right, low, high);return root;}
};

算法分析

  • 时间复杂度:每个节点都被访问了一次,所以时间复杂度为O(N),其中N是树中的节点数。
  • 空间复杂度:递归调用的栈空间,最坏情况下(树完全不平衡),递归的深度可以达到N,所以空间复杂度为O(N)。
方法二:迭代法

算法思路

  1. 首先,处理根节点为空的情况。如果根节点为空,直接返回 nullptr,因为没有需要修剪的节点。
  2. 然后,我们需要找到新的根节点,它的值应当在范围 [low, high] 内。通过迭代循环,将当前根节点移动到满足条件的位置。如果当前根节点的值小于 low,说明应当修剪掉左子树,所以移动到右子树;如果当前根节点的值大于 high,说明应当修剪掉右子树,所以移动到左子树。
  3. 修剪左子树:从当前根节点开始,遍历到左子树的叶节点(最小值),如果叶节点的值小于 low,则将叶节点的右子树连接到当前叶节点的父节点上,从而删除小于 low 的节点。
  4. 修剪右子树:从当前根节点开始,遍历到右子树的叶节点(最大值),如果叶节点的值大于 high,则将叶节点的左子树连接到当前叶节点的父节点上,从而删除大于 high 的节点。
  5. 最后,返回修剪后的根节点。

具体实现

class Solution {
public:TreeNode* trimBST(TreeNode* root, int low, int high) {if (!root) return nullptr;  // 处理根节点为空的情况// 找到新的根节点,值在 [low, high] 范围内while (root && (root->val < low || root->val > high)) {if (root->val < low)root = root->right;elseroot = root->left;}TreeNode *cur = root;// 修剪左子树while (cur && cur->left) {if (cur->left->val < low) {cur->left = cur->left->right;} else {cur = cur->left;}}cur = root;// 修剪右子树while (cur && cur->right) {if (cur->right->val > high) {cur->right = cur->right->left;} else {cur = cur->right;}}return root;}
};

算法分析

  • 时间复杂度:这个解法的时间复杂度取决于两个遍历操作。第一个遍历操作在找到新的根节点时,最多访问树中所有节点,所以是 O(N)。第二个和第三个遍历操作在修剪左右子树时,最多访问树中所有节点,也是 O(N)。综合起来,总的时间复杂度是 O(N)。
  • 空间复杂度:这个解法没有使用额外的数据结构来存储中间结果,只使用了几个辅助变量,所以空间复杂度是 O(1)。

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

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

相关文章

ReenTrantLock可重入锁(和synchronized的区别)总结

可重入性&#xff1a; 从名字上理解&#xff0c;ReenTrantLock的字面意思就是再进入的锁&#xff0c;其实synchronized关键字所使用的锁也是可重入的&#xff0c;两者关于这个的区别不大。两者都是同一个线程没进入一次&#xff0c;锁的计数器都自增1&#xff0c;所以要等到锁…

七夕节日表白:七大网页风格与其适用人群

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

如何使用 ChatGPT 将文本转换为 PowerPoint 演示文稿

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可二次编辑的3D应用场景 步骤 1&#xff1a;将文本转换为幻灯片演示文稿 第一步涉及指示 ChatGPT 根据给定的文本生成具有特定数量幻灯片的演示文稿。首先&#xff0c;您必须向 ChatGPT 提供要转换的文本。 使用以下提示指示…

SpringMVC-2-Spring MVC拦截器详解:从入门到精通

SpringMVC-2-Spring MVC拦截器详解&#xff1a;从入门到精通 今日目标 能够编写拦截器并配置拦截器 1.拦截器【理解】 1 拦截器介绍 1.1 拦截器概念和作用 拦截器&#xff08;Interceptor&#xff09;是一种动态拦截方法调用的机制&#xff0c;在SpringMVC中动态拦截控制器方…

C的进阶C++学习方向

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;软件配置等领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff01;送给自己和读者的…

L1-028 判断素数 测试点全过

题目 本题的目标很简单&#xff0c;就是判断一个给定的正整数是否素数。 输入格式 输入在第一行给出一个正整数N &#xff08; ≤ 10 &#xff09; &#xff08;≤ 10&#xff09; &#xff08;≤10&#xff09;&#xff0c;随后N行&#xff0c;每行给出一个小于 2 3 1 2^ 31…

Python开发环境(Visual Studio Code、Anaconda、PyInstaller、Enigma Virtual Box)

Python开发环境 [Anaconda、PyInstaller、Enigma Virtual Box] AnacondaAnaconda安装搭建Python环境Anaconda命令 Visual Studio CodeVisual Studio Code中Python设置Visual Studio Code中安装PyQt5Visual Studio Code中使用Qt DesignerVisual Studio Code中Anaconda切换虚拟环…

uniapp 自定义手机顶部状态栏(适配状态栏高度)

开启页面自定义导航栏功能 uniapp 在 pages.json 页面设置了全局的 globalStyle 的 "navigationStyle": "custom" 或单页面的 style 的 "navigationStyle": "custom" 之后页面顶部就没有自带的导航栏了&#xff0c;这时用户可自定义该…

介绍一些编程语言— Perl 语言

介绍一些编程语言— Perl 语言 Perl 语言 简介 Perl 是一种动态解释型的脚本语言。 最初的设计者为拉里・沃尔&#xff0c;它于 1987 1987 1987 年 12 12 12 月 18 18 18 日发表。Perl 借取了 C、sed、awk、shell scripting 以及很多其他编程语言的特性。其中最重要的特性…

仓库管理的重点在哪?仓库管理能有哪些软件?

对于做实体生意的中小商户来说&#xff0c;仓库管理工作是重中之重的&#xff0c;仓库管理的好坏&#xff0c;直接影响着门店销售和财务状况。 但对于很多中小商户来说&#xff0c;没有足够的人力和精力去高效地做好仓库管理工作&#xff0c;而借助仓库管理软件或进销存软件来…

SNAT和DNAT

SNAT和DNAT 一、SNAT策略及应用1.1SNAT策略概述1.2开启SNAT的命令1.2.1 临时打开1.2.2永久打开 1.3SNAT转换1&#xff1a;固定的公网IP地址1.4SNAT转换2&#xff1a;非固定的公网IP地址&#xff08;共享动态IP地址&#xff09;1.5SNAT案例1.5.1实验准备1.5.2配置网关服务器&…

Redis之zset(sorted set)类型解读

目录 基本介绍 常用命令 ZADD key score1 member1 [score2 member2] ZRANGE key start stop [WITHSCORES] ZCARD key ZCOUNT key min max ZREM key member [member ...] ZSCORE key member 基本介绍 Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字…

IDEA启动报错【java.sql.SQLSyntaxErrorException: ORA-00904: “P“.“PRJ_NO“: 标识符无效】

IDEA报错如下&#xff1a; 2023-08-17 11:26:15.535 ERROR [egrant-biz,b48324d82fe23753,b48324d82fe23753,true] 24108 --- [ XNIO-1 task-1] c.i.c.l.c.RestExceptionController : 服务器异常org.springframework.jdbc.BadSqlGrammarException: ### Error queryin…

PDF怎么转成PPT文件免费?一个软件解决

随着科技的不断发展和进步&#xff0c;电子文档已经成为我们日常工作和学习中不可或缺的一部分。PDF作为一种跨平台的文件格式&#xff0c;以其可靠性和易读性而备受推崇。然而&#xff0c;在某些情况下&#xff0c;我们可能需要PDF怎么转成PPT文件免费&#xff0c;以便更好地展…

Day 56

Day 56 583. 两个字符串的删除操作 dp[i][j]&#xff1a;以i-1为结尾的字符串word1&#xff0c;和以j-1位结尾的字符串word2&#xff0c;想要达到相等&#xff0c;所需要删除元素的最少次数。 当word1[i - 1] 与 word2[j - 1]相同的时候,dp[i][j] dp[i - 1][j - 1];当word1…

apache配置安全证书https踩坑记录

apache配置安全证书有如下几步 一、申请证书 这个网上有很多免费的&#xff0c;我用的是阿里云的服务器&#xff0c;在阿里云后台就可以申请免费证书。 二、上传证书 申请好证书后&#xff0c;根据服务器用的什么软件&#xff0c;是apache还是ngnix&#xff0c;下载相应的证书…

六大需求管理工具:满足您的需求管理需求

在项目开发和产品设计中&#xff0c;需求管理是确保项目成功的关键所在。通过使用专业的需求管理工具&#xff0c;团队可以更好地追踪、记录和分析需求&#xff0c;提高工作效率并确保项目按时完成。 市场上有许多需求管理工具可供选择&#xff0c;当下有什么好用的需求管理工…

FlashAttention算法详解

这篇文章的目的是详细的解释Flash Attention&#xff0c;为什么要解释FlashAttention呢&#xff1f;因为FlashAttention 是一种重新排序注意力计算的算法&#xff0c;它无需任何近似即可加速注意力计算并减少内存占用。所以作为目前LLM的模型加速它是一个非常好的解决方案&…

拒绝摆烂!C语言练习打卡第五天

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;每日一练 &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、选择题 &#x1f4dd;1.第一题 &#x1f4dd;2.第二题 &#x1f4d…

Linux的基础指令

目录 1、ls指令 .和..意义 2、pwd指令 3、cd指令 ①cd ~ ②cd - 关于cd ..的用法 绝对路径和相对路径 4、touch指令 5、mkdir指令 tree指令 6、rmdir指令 7、rm指令 * 8、man指令 9、cp指令 nano&#xff1a; 10、mv指令 11、cat指令 12、more指令 13、less…