Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package Tree.BinaryTree;
- import Tree.Node;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.PriorityQueue;
- class MaxHeapNode {
- Node node;
- int diffFromTarget;
- public MaxHeapNode(Node node, int d) {
- this.node = node;
- diffFromTarget = d;
- }
- }
- public class ReturnKClosestNodesToTarget {
- static List<Integer> returnKClosestNodesToTarget(Node root, int target, int k) {
- PriorityQueue<MaxHeapNode> maxHeap = new PriorityQueue<>((a,b) -> b.diffFromTarget - a.diffFromTarget);
- traverse(root, target, k, maxHeap);
- List<Integer> res = new ArrayList<>();
- while(!maxHeap.isEmpty()) {
- res.add(maxHeap.poll().node.data);
- }
- return res;
- }
- static void traverse(Node root, int target, int k, PriorityQueue<MaxHeapNode> maxHeap) {
- if( root != null ) {
- //System.out.println("root " + root.data);
- int currDiff = Math.abs(target - root.data);
- if(maxHeap.size() < k) {
- MaxHeapNode n = new MaxHeapNode(root, currDiff);
- maxHeap.offer(n);
- } else {
- MaxHeapNode n = maxHeap.peek();
- int maxDiff = n.diffFromTarget;
- if(maxDiff > currDiff) {
- n = maxHeap.poll();
- n.node = root;
- n.diffFromTarget = currDiff;
- maxHeap.offer(n);
- }
- }
- traverse(root.left, target, k, maxHeap);
- traverse(root.right, target, k, maxHeap);
- }
- }
- public static void main(String args[]) {
- Node root = new Node(1);
- Node n_2 = new Node(2);
- Node n_3 = new Node(3);
- Node n_4 = new Node(4);
- Node n_5 = new Node(5);
- Node n_6 = new Node(6);
- Node n_7 = new Node(7);
- Node n_8 = new Node(8);
- Node n_9 = new Node(9);
- Node n_10 = new Node(10);
- root.left = n_2;
- root.right = n_3;
- n_2.left = n_4;
- n_2.right = n_5;
- n_3.left = n_6;
- n_3.right = n_7;
- n_4.left = n_8;
- n_4.right = n_9;
- n_5.right = n_10;
- System.out.println(returnKClosestNodesToTarget(root, 2, 7));
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement