LeetCode 272. 最接近的二叉搜索树值 II(栈+优先队列)

文章目录

    • 1. 题目
    • 2. 解题

1. 题目

给定一个不为空的二叉搜索树和一个目标值 target,请在该二叉搜索树中找到最接近目标值 target 的 k 个值。

注意:
给定的目标值 target 是一个浮点数
你可以默认 k 值永远是有效的,即 k ≤ 总结点数
题目保证该二叉搜索树中只会存在一种 k 个值集合最接近目标值

示例:
输入: root = [4,2,5,1,3],目标值 = 3.714286,且 k = 2

    4
   / \
  2   5
 / \
1   3

输出: [4,3]

拓展:
假设该二叉搜索树是平衡的,请问您是否能在小于 O(n)(n 为总结点数)的时间复杂度内解决该问题呢?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/closest-binary-search-tree-value-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

类似题目:LeetCode 658. 找到 K 个最接近的元素(二分查找)

  • 使用stack,中序遍历bst,是有序的
  • 将差值最小的k个元素的<差值,自身值>插入优先队列
  • 队列满了k个,且差值为正,且大于堆顶,可以提前结束
struct cmp
{
	bool operator()(vector<double>& a, vector<double>& b)
	{
		return a[0] < b[0];//差值大的在上
	}
};
class Solution {
public:
    vector<int> closestKValues(TreeNode* root, double target, int k) {
        stack<TreeNode*> s;
        priority_queue<vector<double>, vector<vector<double>>, cmp> q;
        TreeNode* cur;
        while(root || !s.empty())
        {
        	while(root)
        	{
        		s.push(root);
        		root = root->left;
        	}
        	cur = s.top();
        	s.pop();
        	root = cur->right;
        	if(q.size() < k)
        		q.push({fabs(cur->val-target), double(cur->val)});
        	else if(q.size()==k && q.top()[0] > fabs(cur->val-target))
        	{	//有更小的差值
        		q.pop();
        		q.push({fabs(cur->val-target), double(cur->val)});
        	}
        	if(q.size()==k && cur->val-target >= q.top()[0])
        		break;
        }
        vector<int> ans(k);
        int i = 0;
        while(!q.empty())
        {
        	ans[i++] = q.top()[1];
        	q.pop();
        }
        return ans;
    }
};

52 ms 22.4 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

你可能感兴趣的:(LeetCode)