package com.interview.books.svinterview; import com.interview.leetcode.utils.TreeNode; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.PriorityQueue; /** * Created_By: stefanie * Date: 14-12-8 * Time: 下午1:02 */ public class SV9_BSTKNN { public Iterable<Integer> findKNN(TreeNode root, int k, int target){ Comparator<Integer> comparator = new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return Math.abs(o2) - Math.abs(o1); } }; PriorityQueue<Integer> closestHeap = new PriorityQueue<>(k, comparator); inorderTraverse(root, closestHeap, k, target); List<Integer> numbers = new ArrayList<>(); while(!closestHeap.isEmpty()){ numbers.add(0, closestHeap.poll() + target); } return numbers; } public void inorderTraverse(TreeNode node, PriorityQueue<Integer> heap, int k, int target){ if(node == null) return; inorderTraverse(node.left, heap, k, target); if(heap.size() < k) heap.add(node.val - target); else { int diff = Math.abs(node.val - target); if(diff < Math.abs(heap.peek())){ heap.poll(); heap.add(node.val - target); } } inorderTraverse(node.right, heap, k, target); } public static void main(String[] args){ TreeNode root = TreeNode.sampleBST(); SV9_BSTKNN finder = new SV9_BSTKNN(); for(Integer num : finder.findKNN(root, 3, 6)){ System.out.print(num + ", "); } System.out.println(); } }