一、题目
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;}
};