【LeetCode二叉树#18】修剪二叉搜索树(涉及重构二叉树与递归回溯)
修剪二叉搜索树
给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。


思路
题目描述得有点唬人,其实意思就是给一个区间范围(比如[2, 7]),然后要求你把节点值不在这个范围内的节点给删除掉,并且之后还是二叉搜索树
一种经典的错误思路是:遇到不符合区间的节点时,直接返回NULL给上一个节点
这样做的话,如果不满足条件的节点的子树还有满足条件的值的话,也会被舍弃,从而出错
当我们找到一个不在规定范围内的节点时,首先要判断它是小于范围还是大于范围
如果节点(假设为A)的值小于规定范围,根据二叉搜索树的性质,其右子树有可能还存在满足规定范围的节点,因此需要继续遍历其右子树
如果节点(假设为A)的值大于规定范围,根据二叉搜索树的性质,其左子树有可能还存在满足规定范围的节点,因此需要继续遍历其左子树
基本思路是这样的
下面来看代码
代码
还是使用递归法来做
1、确定递归函数的参数和返回值
参数肯定是根节点啦,因为我们需要修改二叉树,所以修改的新值需要层层传递到上层递归的调用处,因此需要返回值
那么可以直接用解题模板
class Solution {
public:
//确定递归函数的参数和返回值
TreeNode* trimBST(TreeNode* root, int low, int high) {
}
};
2、确定终止条件
如果当前输入的节点为空,那么应该返回空并结束递归
class Solution {
public:
//确定递归函数的参数和返回值
TreeNode* trimBST(TreeNode* root, int low, int high) {
//确定终止条件
if(root == NULL) return NULL;
}
};
3、确定单层处理逻辑
当前节点小于规定范围时,遍历其右子树
class Solution {
public:
//确定递归函数的参数和返回值
TreeNode* trimBST(TreeNode* root, int low, int high) {
//确定终止条件
if(root == NULL) return NULL;
//确定单层递归逻辑
if(root->val < low){//遍历其右子树
TreeNode* right = trimBST(root->right, low, high);
return right;
}
}
};
解释一下递归右子树的代码的含义
上面那样写的意思是:使用当前节点作为根节点,递归遍历其右子树,最后返回一颗经过修剪的满足条件的右子树
实在不理解或者忘了,可以自己模拟一下过程
同理,当前节点大于规定范围时,遍历其左子树
class Solution {
public:
//确定递归函数的参数和返回值
TreeNode* trimBST(TreeNode* root, int low, int high) {
//确定终止条件
if(root == NULL) return NULL;
//确定单层递归逻辑
if(root->val < low){//遍历其右子树
TreeNode* right = trimBST(root->right, low, high);
return right;
}
if(root->val > high){//遍历其左子树
TreeNode* left = trimBST(root->left, low, high);
return left;
}
//调用递归,把修剪后的左子树或右子树返回
root->left = trimBST(root->left, low, high);
root->right = trimBST(root->right, low, high);
return root;
}
};
注意,这里我们要搜索的是当前节点的左子树或右子树(是整颗树)
还是模拟一下过程把怕之后看又不记得了
首先我们将根节点输入到递归函数中,此时其不满足递归结束的条件,假设其值也在规定范围内
那么此时会调用递归,去遍历根节点的左右子树【第一层递归,希望返回的是一颗修剪后的左或右子树】
然后进入左子树,若当前左子树的根节点不在规定范围内,则触发对应的单层处理逻辑
假设此时触发的是root->val < low条件,那么回去递归遍历当前左子树根节点的右子树【第二层递归,希望返回的是一颗修剪后的右子树】
假设其右子树均满足规定范围,那么当递归遍历到叶子节点后,会触发终止条件,然后每层递归都往上返回自己的结果,从而得到修改后的树
【LeetCode二叉树#18】修剪二叉搜索树(涉及重构二叉树与递归回溯)的更多相关文章
- 代码随想录算法训练营day23 | leetcode 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树
LeetCode 669. 修剪二叉搜索树 分析1.0 递归遍历树时删除符合条件(不在区间中)的节点-如何遍历如何删除 如果当前节点大于范围,递归左树,反之右树 当前节点不在范围内,删除它,把它的子树 ...
- LeetCode 669. 修剪二叉搜索树(Trim a Binary Search Tree)
669. 修剪二叉搜索树 669. Trim a Binary Search Tree 题目描述 LeetCode LeetCode669. Trim a Binary Search Tree简单 J ...
- LeetCode 669. Trim a Binary Search Tree修剪二叉搜索树 (C++)
题目: Given a binary search tree and the lowest and highest boundaries as L and R, trim the tree so th ...
- Java实现 LeetCode 669 修剪二叉搜索树(遍历树)
669. 修剪二叉搜索树 给定一个二叉搜索树,同时给定最小边界L 和最大边界 R.通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) .你可能需要改变树的根节点,所以结果应当返回 ...
- [Swift]LeetCode669. 修剪二叉搜索树 | Trim a Binary Search Tree
Given a binary search tree and the lowest and highest boundaries as L and R, trim the tree so that a ...
- 【JavaScript】Leetcode每日一题-二叉搜索树的范围和
[JavaScript]Leetcode每日一题-二叉搜索树的范围和 [题目描述] 给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和. 示例1: 输入: ...
- 【python】Leetcode每日一题-二叉搜索树节点最小距离
[python]Leetcode每日一题-二叉搜索树节点最小距离 [题目描述] 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 . 示例1: 输入:root = [4 ...
- 【LeetCode】98. 验证二叉搜索树
98. 验证二叉搜索树 知识点:二叉树:递归 题目描述 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大 ...
- LeetCode 96——不同的二叉搜索树
1. 题目 2. 解答 以 \(1, 2, \cdots, n\) 构建二叉搜索树,其中,任意数字都可以作为根节点来构建二叉搜索树.当我们将某一个数字作为根节点后,其左边数据将构建为左子树,右边数据将 ...
- LeetCode.938-范围内求二叉搜索树节点值之和(Range Sum of BST)
这是悦乐书的第359次更新,第386篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第221题(顺位题号是938).给定二叉搜索树的根节点,返回节点值在[L,R]之间的所有 ...
随机推荐
- [转帖]Linux Page cache和Buffer cache
https://www.cnblogs.com/hongdada/p/16926655.html free 命令常用参数 free 命令用来查看内存使用状况,常用参数如下: -h human-read ...
- StorageClass 简单学习
StorageClass 简单学习 学习资料来源 https://www.jianshu.com/p/5e565a8049fc https://zhuanlan.zhihu.com/p/2895019 ...
- 安装 Nginx 修改默认端口
用远程工具连接我们上次购买的机器,这里我要介绍一个知识点,博主使用的工具是 MobaXterm,这个工具有一个多操作的功能,在下图的位置可以开启多操作,然后连接你的服务器机子即可: 首先我们将机子里面 ...
- MiniRBT中文小型预训练模型:结合了全词掩码技术和两段式知识蒸馏技术,加快推理速度
MiniRBT中文小型预训练模型:结合了全词掩码(Whole Word Masking)技术和两段式知识蒸馏(Knowledge Distillation)技术,加快推理速度 在自然语言处理领域中,预 ...
- python处理Excel实现自动化办公教学(数据筛选、公式操作、单元格拆分合并、冻结窗口、图表绘制等)【三】
相关文章: python处理Excel实现自动化办公教学(含实战)[一] python处理Excel实现自动化办公教学(含实战)[二] python处理Excel实现自动化办公教学(数据筛选.公式操作 ...
- 3.1 Windows驱动开发:内核远程堆分配与销毁
在开始学习内核内存读写篇之前,我们先来实现一个简单的内存分配销毁堆的功能,在内核空间内用户依然可以动态的申请与销毁一段可控的堆空间,一般而言内核中提供了ZwAllocateVirtualMemory这 ...
- 编译Apache服务部署静态网站
Apache是世界使用排名第一的Web服务器软件,它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一.它快速.可靠并且可通过简单的API扩充, ...
- 部署19c ADG过程中的问题处理
回忆起来也是有些年没亲自动手搭建ADG了,今天正好有个机会重温,客户环境是19.16,恍惚记得上一次搭ADG还是在11.2.0.4的时代,时光荏苒啊. 正好看下19c的ADG和11g的ADG在部署方面 ...
- .NET Core开发实战(第27课:定义Entity:区分领域模型的内在逻辑和外在行为)--学习笔记
27 | 定义Entity:区分领域模型的内在逻辑和外在行为 上一节讲到领域模型分为两层 一层是抽象层,定义了公共的接口和类 另一层就是领域模型的定义层 先看一下抽象层的定义 1.实体接口 IEnti ...
- Apache Hudi 设计与架构解读
1. 简介 Apache Hudi(简称:Hudi)允许您在现有的hadoop兼容存储之上存储大量数据,同时提供两种原语,使得除了经典的批处理之外,还可以在数据湖上进行流处理. 这两种原语分别是: 1 ...