力扣日记1.13-【二叉树篇】669. 修剪二叉搜索树

力扣日记:【二叉树篇】669. 修剪二叉搜索树

日期:2023.1.13
参考:代码随想录、力扣

669. 修剪二叉搜索树

题目描述

难度:中等

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

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

示例 1:
在这里插入图片描述

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

示例 2:
在这里插入图片描述

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

提示:

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

题解

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:// 递归的返回值:当前root树经过修剪后的新根节点TreeNode* trimBST(TreeNode* root, int low, int high) {// 终止条件:遇到空节点就返回空if (root == nullptr)    return root;// 如果root的值小于low,此时root以及root的左子树一定是要删除的// 但是root的右子树(大于root)可能存在满足条件的,所以要对root的右子树进行修剪,并将修剪后的右子树根节点返回给root的上一层来接收(因为这里的root是要被删除的,所以是返回给root的上一层)if (root->val < low) {return trimBST(root->right, low, high); // 对root的右子树进行修剪,并将新的右子树根节点返回给上一层} // 大于high的情况也是同理,此时对root的左子树进行修剪,并返回新的左子树根节点给上一层else if (root->val > high) {return trimBST(root->left, low, high);}// 如果当前root满足条件,但其左右子树可能存在不满足条件的// 则对其左右子树分别进行修剪root->left = trimBST(root->left, low, high);    // 左子树修剪后作为root的左节点(这里当前层可能就会接收来自root的左节点的下一层的根节点)root->right = trimBST(root->right, low, high);  // 右子树同理// 返回当前rootreturn root;}
};

复杂度

时间复杂度:
空间复杂度:

思路总结

  • 本题相比于前两道的插入和删除,还是复杂了许多,且不同于以往的递归,本题在不符合处理(如这里的删除)条件时需要递归,在符合处理(删除)条件时也要递归!!!(以前一般都是只需要在不符合类似于中节点的处理条件的时候进行递归)
  • 这里要明确理解递归函数的意义:即对传入的root树进行修剪,并返回修剪后的树的新根节点
  • 且读题要准确,是节点值不在[low, high]范围的要剔除
  • 因此,删除时要分别对小于low和大于high的情况进行处理:
    • 对于root的值小于low的情况,:
      • 此时root以及root的左子树一定是要删除的
      • 但是root的右子树(大于root)可能存在在范围内的节点,所以要对root的右子树进行修剪,并将修剪后的右子树根节点返回给root的上一层来接收(因为这里的root是要被删除的,所以是返回给root的上一层)
      • 这里要理解“返回给上一层”的含义:即return后,是由root的上一层去接收的
        在这里插入图片描述
        对应于代码中就是
        当前层(这里的0):
        if (root->val < low) {return trimBST(root->right, low, high); // 对root的右子树进行修剪,并将新的右子树根节点返回给上一层
        } 
        
        而return后回到上一层(即3),会接收来自0的右子树的根节点
        root->left = trimBST(root->left, low, high);    // 左子树修剪后作为root的左节点(这里当前层可能就会接收来自root的左节点的下一层的根节点)
        
    • 对于root的值大于high的情况处理是同理的。
  • 在写代码时,就按注释时的思路:
    • 终止条件:遇到空节点就返回空
    • 如果root的值小于low
      • 此时对root的右子树进行修剪,并将修剪后的右子树根节点返回给root的上一层来接收
    • 如果root的值大于high
      • 此时对root的左子树进行修剪,并返回新的左子树根节点给上一层
    • 如果root的是符合条件的(但其左右子树可能存在不满足条件需要修剪的)
      • 则对其左右子树分别进行修剪 ,此时要用root的左右节点去接收,即:
      • 左子树修剪后作为root的左节点
      • 右子树同理
    • 最后返回root

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

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

相关文章

ASP.NET进销存系统源码

ASP.NET进销存系统源码 功能介绍&#xff1a; 财务 销售清单&#xff0c;填写销售单&#xff0c;客户管理&#xff0c;添加客户资料 销售 销售清单&#xff0c;填写销售单&#xff0c;客户管理&#xff0c;添加客户资料 仓库 仓库结存&#xff0c;仓库盘点&#xff0c;盘点结…

java期末复习题

1.任何一个Java程序都默认引入一个包&#xff0c;这个包的名字是________________。 正确答案&#xff1a;java.lang Java程序默认引入的包是java.lang包。这个包是Java语言的核心&#xff0c;它提供了Java中的基础类&#xff0c;包括基本Object类、Class类、String类、基本类…

HandlerInterceptor拦截器 postHandle执行addHeader无效,postHandle执行setStatus无效的解决方案

问题描述 想在postHandle方法里执行addHeader方法来补充一些Header信息&#xff08;如分页信息&#xff09;&#xff0c;但是最后执行却未如期显示 拦截器源码 import com.zhangziwa.practisesvr.utils.response.ResponseContext; import jakarta.servlet.http.HttpServletR…

【Maven】004-基于 IDEA 构建 Maven 工程

【Maven】004-基于 IDEA 构建 Maven 工程 文章目录 【Maven】004-基于 IDEA 构建 Maven 工程一、概述1、项目构建2、命令方式项目构建命令war 包打包插件和 jdk 版本不匹配 二、项目构建1、命令方式2、IDEA 可视化方式3、构建产物 一、概述 1、项目构建 项目构建是将软件开发…

Star 8K+,使用.NET开发的开源NoSQL数据库

LiteDB 是一个轻量级、快速、易用的 .NET NoSQL 嵌入式数据库&#xff0c;完全用 C# 托管代码开发&#xff0c;并且是免费和开源的。它非常适合在移动应用&#xff08;Xamarin iOS/Android&#xff09;和小型的桌面/Web 应用中使用。 主要特点 简单易用的 API&#xff0c;类似…

前端远原生js爬取数据的小案例

使用方法 注意分页的字段需要在代码里面定制化修改&#xff0c;根据你爬取的接口&#xff0c;他的业务规则改代码中的字段。比如我这里总条数叫total&#xff0c;人家的不一定。返回的数据我这里是data.rows&#xff0c;看看人家的是叫什么字段&#xff0c;改改代码。再比如我这…

Git的安装

1、下载 官网地址&#xff1a; https://git-scm.com/或https://github.com/git-for-windows/git/releases 百度网盘链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/13_asGO-XQb5KWWH_V7rq6g?pwd0630 2、安装 ①查看GNU协议&#xff0c;可以直接点击下一步。 ②…

dns 域名解析

一&#xff0c;dns 是什么 domain name server 域名解析 将域名转化成 ip 地址 这是个7层协议 既使用tcp53端口 &#xff08;主从之间同步&#xff09; 也使用udp53端口 &#xff08;域名名字解析&#xff09; 二&#xff0c;dns 实现方法 1&#xff0c;通过…

POI:对Excel的基本读操作 整理2

1 简单读取操作 public class ExcelRead {String PATH "D:\\Idea-projects\\POI\\POI_projects";// 读取的一系列方法// ...... } 因为07版本和03版本操作流程大差不差&#xff0c;所以这边就以03版本为例 Testpublic void testRead03() throws IOException {//获取…

element+vue 之图片放大器

1.安装插件 npm install vue-photo-zoom-pro2.main.js导入 // 放大镜 import VuePhotoZoomPro from vue-photo-zoom-pro Vue.use(VuePhotoZoomPro)3.页面使用 <vue-photo-zoom-pro:url"imgUrl":out-zoomer"true":scale"2"style"width:…

CST2024的License服务成功启动,仍报错——“The desired daemon is down...”,适用于任何版本!基础设置遗漏!

CST2024的License服务成功启动&#xff0c;仍报错——“The desired daemon is down…”&#xff0c;适用于任何版本&#xff01;基础设置遗漏&#xff01; CST2024的License服务成功启动后报错 若不能成功启动License服务&#xff0c;有可能是你的计算机名称带中文&#xff…

【嵌入式——QT】QT静态编译

【嵌入式——QT】QT静态编译 QT下载查看文档下载Visual Studio打开命令行模式编译添加QT到Qt Creator编译示例 QT下载 下载地址 进入目录&#xff0c;我这里选择的qt-everywhere-src-5.14.1.zip。 查看文档 解压压缩包打开源码&#xff0c;查看README文件&#xff0c;里面…