Closest Binary Search Tree Value II

hard tree bst deque inorder

Problem

Given the root of a BST and a target value, return the k values that are closest to the target.

Inputroot = [4,2,5,1,3], target = 3.714, k = 2
Output[4,3]
Sorted in-order is [1,2,3,4,5]; closest two to 3.714 are 3 and 4.

def closest_k_values(root, target, k):
    from collections import deque
    out = deque()
    def inorder(node):
        if not node: return
        inorder(node.left)
        if len(out) < k:
            out.append(node.val)
        elif abs(node.val - target) < abs(out[0] - target):
            out.popleft(); out.append(node.val)
        else:
            return  # pruning is possible here
        inorder(node.right)
    inorder(root)
    return list(out)
function closestKValues(root, target, k) {
  const out = [];
  function inorder(node) {
    if (!node) return;
    inorder(node.left);
    if (out.length < k) out.push(node.val);
    else if (Math.abs(node.val - target) < Math.abs(out[0] - target)) {
      out.shift(); out.push(node.val);
    } else return;
    inorder(node.right);
  }
  inorder(root);
  return out;
}
class Solution {
    Deque out = new ArrayDeque<>();
    int K; double T;
    public List closestKValues(TreeNode root, double target, int k) {
        K = k; T = target;
        inorder(root);
        return new ArrayList<>(out);
    }
    void inorder(TreeNode node) {
        if (node == null) return;
        inorder(node.left);
        if (out.size() < K) out.add(node.val);
        else if (Math.abs(node.val - T) < Math.abs(out.peekFirst() - T)) {
            out.pollFirst(); out.add(node.val);
        } else return;
        inorder(node.right);
    }
}
class Solution {
    deque out;
    int K; double T;
    void inorder(TreeNode* node) {
        if (!node) return;
        inorder(node->left);
        if ((int)out.size() < K) out.push_back(node->val);
        else if (abs(node->val - T) < abs(out.front() - T)) {
            out.pop_front(); out.push_back(node->val);
        } else return;
        inorder(node->right);
    }
public:
    vector closestKValues(TreeNode* root, double target, int k) {
        K = k; T = target;
        inorder(root);
        return vector(out.begin(), out.end());
    }
};
Time: O(n) Space: O(k + h)