DDSA Solutions

K closest Values

Time: O(n)
Space: O(k)
Advertisement

Intuition

Find k elements closest to a target in BST. In-order traversal + sliding window or priority queue.

Algorithm

  1. 1In-order traversal gives sorted sequence. Use deque of size k: if adding new element improves (closer than front): add and pop front if size > k.

Common Pitfalls

  • In-order + deque maintains closest k. Compare new element vs oldest in deque. Stop when distance starts increasing.
K closest Values.java
Java
// Approach: In-order BST traversal collecting nodes within distance k of target, or BST search + two-pointer.
// Time: O(n) Space: O(k)
import java.util.*;

class Node {
    int data;
    Node left;
    Node right;

    Node(int data) {
        this.data = data;
        left = null;
        right = null;
    }
}

class Solution {
    public ArrayList<Integer> getKClosest(Node root, int target, int k) {
        PriorityQueue<Pair> pq = new PriorityQueue<>((a, b) -> {
            if (a.diff == b.diff)
                return Integer.compare(b.val, a.val);

            return Integer.compare(b.diff, a.diff);
        });

        inOrder(root, pq, target, k);
        ArrayList<Integer> ls = new ArrayList<>();

        while (!pq.isEmpty() && ls.size() != k)
            ls.add(pq.poll().val);

        return ls;
    }

    public void inOrder(Node root, PriorityQueue<Pair> pq, int target, int k) {
        if (root == null)
            return;

        inOrder(root.left, pq, target, k);
        pq.add(new Pair(root.data, Math.abs(root.data - target)));
        if (pq.size() > k)
            pq.poll();
        inOrder(root.right, pq, target, k);
    }

    class Pair {
        int val;
        int diff;

        Pair(int val, int diff) {
            this.val = val;
            this.diff = diff;
        }
    }
}
Advertisement
Was this solution helpful?