题目地址:
https://leetcode.com/problems/closest-binary-search-tree-value-ii/description/
给定一棵 n n n个节点的二叉搜索树,再给定一个值 t t t和一个正整数 k k k,求树中离 t t t最近的 k k k个数。题目保证 k ≤ n k\le n k≤n。
带着两个双端队列对BST进行中序遍历,将小于等于 t t t的最大的 k k k个数和大于 t t t最小的 k k k个数存下来(如果不够 k k k个则全存)。最后用类似双指针的办法,从离 t t t最近的数开始两边扩展至 k k k个即可。代码如下:
class Solution {
public:
vector<int> closestKValues(TreeNode* root, double t, int k) {
deque<int> dq1, dq2;
dfs(root, t, k, dq1, dq2);
vector<int> res;
while (res.size() < k) {
if (dq2.empty() ||
dq1.size() && abs(dq1.back() - t) <= abs(dq2.front() - t)) {
res.push_back(dq1.back());
dq1.pop_back();
} else {
res.push_back(dq2.front());
dq2.pop_front();
}
}
return res;
}
void dfs(TreeNode* root, double t, int k, deque<int>& dq1, deque<int>& dq2) {
if (!root) return;
dfs(root->left, t, k, dq1, dq2);
if (root->val <= t) {
dq1.push_back(root->val);
if (dq1.size() > k) dq1.pop_front();
} else if (dq2.size() < k)
dq2.push_back(root->val);
dfs(root->right, t, k, dq1, dq2);
}
};
时间复杂度 O ( n + k ) O(n+k) O(n+k),空间 O ( h ) O(h) O(h)。