Skip to content

Closest Binary Search Tree Value II

Leetcode 272. Closest Binary Search Tree Value II

Table of Contents

Leetcode 272. Closest Binary Search Tree Value II

Problem

Given the root of a binary search tree, a target value, and an integer k, return the k values in the BST that are closest to the target. You may return the answer in any order.

You are guaranteed to have only one unique set of k values in the BST that are closest to the target.

Example 1:

Leetcode 272. Closest Binary Search Tree Value II
Leetcode 272. Closest Binary Search Tree Value II
Input: root = [4,2,5,1,3], target = 3.714286, k = 2
Output: [4,3]

Example 2:

Input: root = [1], target = 0.000000, k = 1
Output: [1]

Constraints:

  • The number of nodes in the tree is n.
  • 1 <= k <= n <= 104.
  • 0 <= Node.val <= 109
  • -109 <= target <= 109

Follow up: Assume that the BST is balanced. Could you solve it in less than O(n) runtime (where n = total nodes)?

Solution

The straight forward solution of this problem is to use a heap (a.k.a priority queue).

We can run an inorder traversal of the tree. That way, we will get the values in sorted order. During that process, we can save the absolute difference between target and node value to the heap. Also, we need to have the node value. That’s why it is good to have a pair of absolute difference and node value [something like {difference, val}] in the heap. Also, when we push those pairs in heap, we will check if heap size is greater than K. If it is, we will remove the last element from heap.

Below is the code that implements this idea.

C++ Code
/**
 * 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:
    void inorder(TreeNode* root, double target, int k, priority_queue<pair<double, int>>& pq){
        if(root == NULL)
            return;
        inorder(root->left, target, k, pq);
        pq.push({abs(target - root->val), root->val});
        if(pq.size() > k)
            pq.pop();
        inorder(root->right, target, k, pq);
    }
    
    vector<int> closestKValues(TreeNode* root, double target, int k) {
        vector<int> ans;
        if(root == NULL)
            return ans;
        priority_queue<pair<double, int>> pq;
        inorder(root, target, k, pq);
        while(!pq.empty()){
            ans.push_back(pq.top().second);
            pq.pop();
        }
        return ans;
    }
};
Conclusion

Hope you understood this solution. If not, please comment below which part was not so clear.

Happy Coding! 🙂

22 thoughts on “Closest Binary Search Tree Value II”

  1. Apoiar ferramentas de apostas e estar equipado com uma plataforma diversificada de transações financeiras, a 20Bet oferece suporte tangível aos jogadores. Este é um lugar onde eles podem apostar com dinheiro real, respaldados por concorrentes de diversas disciplinas esportivas. 20bet

  2. Dear foolishhungry.com owner, You always provide great examples and real-world applications.

  3. naturally like your web site however you need to take a look at the spelling on several of your posts. A number of them are rife with spelling problems and I find it very bothersome to tell the truth on the other hand I will surely come again again.

  4. Dear foolishhungry.com administrator, You always provide clear explanations and step-by-step instructions.

  5. I loved as much as youll receive carried out right here The sketch is tasteful your authored material stylish nonetheless you command get bought an nervousness over that you wish be delivering the following unwell unquestionably come more formerly again since exactly the same nearly a lot often inside case you shield this hike

Leave a Reply

Your email address will not be published. Required fields are marked *