1.题目链接
https://leetcode.cn/problems/closest-nodes-queries-in-a-binary-search-tree/description/
2.解题思路
由于题目上没说二叉搜索树是平衡的,故如果在最坏情况下,二叉搜索树是一条链的情况下,这时针对每条询问都从上向下遍历的话,时间复杂度会达到O(n^2),会超时。
所以我们不如先中序遍历,将树从小到大存起来,然后再针对询问进行二分搜索,最后时间复杂度是O(nlogn)。
3.奉上代码
class Solution {
public:
vector<int> v;
void dfs(TreeNode* t)
{
if(t->left!=nullptr)
dfs(t->left);
v.push_back(t->val);
if(t->right!=nullptr)
dfs(t->right);
}
int query_min(int u)
{
int l=0,r=v.size()-1;
while(l<r)
{
int mid=(l+r+1)>>1;
if(v[mid]<=u)
l=mid;
else
r=mid-1;
}
if(v[l]<=u)
return v[l];
return -1;
}
int query_max(int u)
{
int l=0,r=v.size()-1;
while(l<r)
{
int mid=(l+r)>>1;
if(v[mid]>=u)
r=mid;
else
l=mid+1;
}
if(v[l]>=u)
return v[l];
return -1;
}
vector<vector<int>> closestNodes(TreeNode* root, vector<int>& queries) {
vector<vector<int>> res;
dfs(root);
for(int i=0;i<queries.size();i++)
{
vector<int> e;
e.push_back(query_min(queries[i]));
e.push_back(query_max(queries[i]));
res.push_back(e);
}
return res;
}
};