​LeetCode解法汇总2476. 二叉搜索树最近节点查询

 目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

GitHub - September26/java-algorithms: 算法题汇总,包含牛客,leetCode,lintCode等网站题目的解法和代码,以及完整的mode类,甚至链表代码生成工具都有提供。

原题链接:. - 力扣(LeetCode)


描述:

给你一个 二叉搜索树 的根节点 root ,和一个由正整数组成、长度为 n 的数组 queries 。

请你找出一个长度为 n 的 二维 答案数组 answer ,其中 answer[i] = [mini, maxi] :

  • mini 是树中小于等于 queries[i] 的 最大值 。如果不存在这样的值,则使用 -1 代替。
  • maxi 是树中大于等于 queries[i] 的 最小值 。如果不存在这样的值,则使用 -1 代替。

返回数组 answer 。

示例 1 :

输入:root = [6,2,13,1,4,9,15,null,null,null,null,null,null,14], queries = [2,5,16]
输出:[[2,2],[4,6],[15,-1]]
解释:按下面的描述找出并返回查询的答案:
- 树中小于等于 2 的最大值是 2 ,且大于等于 2 的最小值也是 2 。所以第一个查询的答案是 [2,2] 。
- 树中小于等于 5 的最大值是 4 ,且大于等于 5 的最小值是 6 。所以第二个查询的答案是 [4,6] 。
- 树中小于等于 16 的最大值是 15 ,且大于等于 16 的最小值不存在。所以第三个查询的答案是 [15,-1] 。

示例 2 :

输入:root = [4,null,9], queries = [3]
输出:[[-1,4]]
解释:树中不存在小于等于 3 的最大值,且大于等于 3 的最小值是 4 。所以查询的答案是 [-1,4] 。

提示:

  • 树中节点的数目在范围 [2, 105] 内
  • 1 <= Node.val <= 106
  • n == queries.length
  • 1 <= n <= 105
  • 1 <= queries[i] <= 106

解题思路:

这道题,其实可以分成寻找小于等于target的数中最大的,以及大于等于target的数中最小的。

寻找小于等于target的数中最大的数值,属于典型的二叉树搜索,构建一个方法searchValue进行二叉树递归遍历。

传入参数1:TreeNode root,代表当前遍历的节点

传入参数2:int lastValue,代表上一次匹配到的最合适的值,

传入参数3:int target,代表目标值。

方法中,如果节点值等于目标值,则直接返回当前值即可。

如果节点值大于目标值,则递归搜索其左子树,因为只有左子树的值才会比目标值小,最合适的值仍然为上一次的,因为这一次的不满足。

如果节点值小于目标值,则递归搜索其左子树,因为只有右子树的值才会比目标值大,最合适的值调整为当前值,因为本地的值符合匹配。

寻找大于等于target的数中最小的方法也是一样。

代码:

方法1:

class Solution2476
{
public:vector<vector<int>> closestNodes(TreeNode *root, vector<int> &queries){vector<vector<int>> list;for (int i : queries){int i1 = searchValue(root, true, -1, i);int i2 = searchValue(root, false, -1, i);vector<int> vec = {i1, i2};list.push_back(vec);}return list;}// 寻找比target小但最接近target的值int searchValue(TreeNode *root, bool isSmall, int lastValue, int target){if (root == nullptr){return lastValue;}int val = root->val;if (val == target){return val;}if (val > target){return searchValue(root->left, isSmall, isSmall ? lastValue : val, target);}return searchValue(root->right, isSmall, isSmall ? val : lastValue, target);}
};

方法2:

class Solution2476
{
public:vector<vector<int>> closestNodes(TreeNode *root, vector<int> &queries){vector<int> sortList;vector<TreeNode *> list;search(root, sortList);vector<vector<int>> res;for (int i = 0; i < queries.size(); i++){int target = queries[i];int left = -1, right = -1;auto it = lower_bound(sortList.begin(), sortList.end(), target);if (it != sortList.end()){right = *it;if (*it == target){left = *it;res.push_back({left, right});continue;}}if (it != sortList.begin()){left = *(--it);}res.push_back({left, right});}return res;}// 寻找比target小但最接近target的值void search(TreeNode *node, vector<int> &sortList){if (node == nullptr)return;search(node->left, sortList);sortList.push_back(node->val);search(node->right, sortList);}
};

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

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

相关文章

企业数字化转型的第一步:由被动多云向主动多云转变

随着经济环境、市场形势、技术发展、用户需求等诸多因素的变化&#xff0c;数字化转型为企业进一步提升效率和竞争力、提供更加丰富的个性化产品和服务、进行业务场景创新、探寻新的增长机会和运营模式提供了崭新的途径。越来越多的企业意识到&#xff0c;数字化转型已不是企业…

[UUCTF 2022 新生赛]ez_rce

这个题目是很简单的&#xff0c;有很多中解法&#xff0c;我来说几种&#xff0c;大家可以参考一下 1.有一个命令是l\s等于ls&#xff0c;但是我尝试codel\s结果还是被过滤了&#xff0c;于是使用printf命令包含l\s&#xff0c;加上反引号就是先执行反引号里的内容&#xff0c…

UE5 UE4 不同关卡使用Sequence动画

参考自&#xff1a;关于Datasmith导入流程 | 虚幻引擎文档 (unrealengine.com) 关卡中的Sequence动画序列&#xff0c;包含特定关卡中的Actor的引用。 将同一个Sequcen动画资源放入其他关卡&#xff0c;Sequence无法在新关卡中找到相同的Actor&#xff0c;导致报错。 Sequen…

我写了个ImageWindow应用

文章目录 0 引言1 应用简介2 主要功能和特点2.1 多图像同/异步像素级对比2.2 支持多达30种图像格式2.3 高效率的图像处理性能 3 简明使用教程3.1 软件下载安装与更新3.1.1 软件下载与安装3.1.2 软件更新 3.2 多视窗添加并自动最优排列3.3 多样化图像导入方式3.4 自动切换显示模…

综合练习(一)

目录 列出薪金高于部门 30 的所有员工薪金的员工姓名和薪金、部门名称、部门人数 列出与 ALLEN从事相同工作的所有员工及他们的部门名称、部门人数、领导姓名 Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 列出薪金高于部门 30 的所…

嵌入式学习第二十三天!(进程间通信)

进程间的通信&#xff1a; 1. 管道 2. 信号 3. 消息队列 4. 共享内存 5. 信号灯 6. 套接字 1. 管道&#xff1a; 1. 无名管道 无名管道只能用于具有亲缘关系的进程间通信 原因&#xff1a;无名管道没有名字&#xff0c;所有找不到管道的具体位置&#xff0c;那么在创建子进程前…

蓝牙耳机和笔记本电脑配对连接上了,播放设备里没有显示蓝牙耳机这个设备,选不了输出设备

环境&#xff1a; WIN10 杂牌蓝牙耳机6s 问题描述&#xff1a; 蓝牙耳机和笔记本电脑配对连接上了&#xff0c;播放设备里没有显示蓝牙耳机这个设备&#xff0c;选不了输出设备 解决方案&#xff1a; 1.打开设备和打印机&#xff0c;找到这个设备 2.选中这个设备&#…

Tomcat源码解析(二): Bootstrap和Catalina

Tomcat源码系列文章 Tomcat源码解析(一)&#xff1a; Tomcat整体架构 Tomcat源码解析(二)&#xff1a; Bootstrap和Catalina 目录 一、基础组件1、Lifecycle生命周期顶级接口2、组件的默认实现 二、启动类Bootstrap1、main2、init3、load与start 三、加载Catalina1、load2、s…

xss过waf的小姿势

今天看大佬的视频学到了几个操作 首先是拆分发可以用self将被过滤的函数进行拆分 如下图我用self将alert拆分成两段依然成功执行 然后学习另一种姿势 <svg id"YWxlcnQoIlhTUyIp"><img src1 οnerrοr"window[eval](atob(document.getElementsByTagNa…

深入理解Java泛型及其在实际编程中的应用

第1章&#xff1a;泛型的起源与重要性 大家好&#xff0c;我是小黑&#xff0c;在Java里&#xff0c;泛型&#xff08;Generics&#xff09;是一种不可或缺的特性&#xff0c;它允许咱们在编码时使用类型&#xff08;Type&#xff09;作为参数。这听起来可能有点绕&#xff0c…

单细胞Seurat - 细胞聚类(3)

本系列持续更新Seurat单细胞分析教程&#xff0c;欢迎关注&#xff01; 维度确定 为了克服 scRNA-seq 数据的任何单个特征中广泛的技术噪音&#xff0c;Seurat 根据 PCA 分数对细胞进行聚类&#xff0c;每个 PC 本质上代表一个“元特征”&#xff0c;它结合了相关特征集的信息。…

【网站项目】424学报稿件管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…