Given a non-empty binary search tree and a target value, find k values in the BST that are closest to the target.
Note:
Follow up:
Assume that the BST is balanced, could you solve it in less than O(n) runtime (where n = total nodes)?
Hint:
getPredecessor(N)
, which returns the next smaller node to N.getSuccessor(N)
, which returns the next larger node to N.[思路]
prefix traverse. 同时维护一个大小为k的 max heap. 注意根据bst的性质,在diff 大于 maxHeap时, 可以只遍历一边的子树.
[CODE]
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public List<Integer> closestKValues(TreeNode root, double target, int k) { PriorityQueue<Double> maxHeap = new PriorityQueue<Double>(k, new Comparator<Double>() { @Override public int compare(Double x, Double y) { return (int)(y-x); } }); Set<Integer> set = new HashSet<Integer>(); rec(root, target, k, maxHeap, set); return new ArrayList<Integer>(set); } private void rec(TreeNode root, double target, int k, PriorityQueue<Double> maxHeap, Set<Integer> set) { if(root==null) return; double diff = Math.abs(root.val-target); if(maxHeap.size()<k) { maxHeap.offer(diff); set.add(root.val); } else if( diff < maxHeap.peek() ) { double x = maxHeap.poll(); if(! set.remove((int)(target+x))) set.remove((int)(target-x)); maxHeap.offer(diff); set.add(root.val); } else { if(root.val > target) rec(root.left, target, k, maxHeap,set); else rec(root.right, target, k, maxHeap, set); return; } rec(root.left, target, k, maxHeap, set); rec(root.right, target, k, maxHeap, set); } }