一、题目
1、题目描述
给你一个 二叉搜索树 的根节点
root,和一个由正整数组成、长度为n的数组queries。请你找出一个长度为
n的 二维 答案数组answer,其中answer[i] = [mini, maxi]:
mini是树中小于等于queries[i]的 最大值 。如果不存在这样的值,则使用-1代替。
maxi是树中大于等于queries[i]的 最小值 。如果不存在这样的值,则使用-1代替。返回数组
answer。
2、接口描述
/*** 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:vector<vector<int>> closestNodes(TreeNode* root, vector<int>& queries) {}
};3、原题链接
2476. 二叉搜索树最近节点查询
二、解题报告
1、思路分析
根据二叉搜索树的性质,我们可以通过中序遍历得到有序序列,然后对于每个查询直接二分即可
2、复杂度
时间复杂度: O(nlogn)空间复杂度:O(n)
3、代码详解
/*** 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:
int a[100005], tot;void dfs(TreeNode* t){if(!t) return;dfs(t->left);a[tot++] = t->val;dfs(t->right);}vector<vector<int>> closestNodes(TreeNode* root, vector<int>& queries) {vector<vector<int>> ret;tot = 0, dfs(root);for(auto& x : queries) {int id = lower_bound(a, a + tot, x) - a;if(a[id] == x) {ret.emplace_back(vector<int>{x, x});continue;}ret.emplace_back(vector<int>{(id?a[id-1]:-1), (id<tot?a[id]:-1)});}return ret;}
};