Advertisement
asrivenki

Binary Tree: ReturnKClosestNodesToTarget

Nov 20th, 2019
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.31 KB | None | 0 0
  1. package Tree.BinaryTree;
  2.  
  3. import Tree.Node;
  4.  
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. import java.util.PriorityQueue;
  8.  
  9. class MaxHeapNode {
  10.     Node node;
  11.     int diffFromTarget;
  12.  
  13.     public MaxHeapNode(Node node, int d) {
  14.         this.node = node;
  15.         diffFromTarget = d;
  16.     }
  17. }
  18.  
  19. public class ReturnKClosestNodesToTarget {
  20.  
  21.     static List<Integer> returnKClosestNodesToTarget(Node root, int target, int k) {
  22.         PriorityQueue<MaxHeapNode> maxHeap = new PriorityQueue<>((a,b) -> b.diffFromTarget - a.diffFromTarget);
  23.         traverse(root, target, k, maxHeap);
  24.  
  25.         List<Integer> res = new ArrayList<>();
  26.         while(!maxHeap.isEmpty()) {
  27.             res.add(maxHeap.poll().node.data);
  28.         }
  29.  
  30.         return res;
  31.     }
  32.  
  33.     static void traverse(Node root, int target, int k, PriorityQueue<MaxHeapNode> maxHeap) {
  34.         if( root != null ) {
  35.             //System.out.println("root " + root.data);
  36.             int currDiff = Math.abs(target - root.data);
  37.             if(maxHeap.size() < k) {
  38.                 MaxHeapNode n = new MaxHeapNode(root, currDiff);
  39.                 maxHeap.offer(n);
  40.             } else {
  41.                 MaxHeapNode n = maxHeap.peek();
  42.                 int maxDiff = n.diffFromTarget;
  43.  
  44.                 if(maxDiff > currDiff) {
  45.                     n = maxHeap.poll();
  46.                     n.node = root;
  47.                     n.diffFromTarget = currDiff;
  48.                     maxHeap.offer(n);
  49.                 }
  50.             }
  51.  
  52.             traverse(root.left, target, k, maxHeap);
  53.             traverse(root.right, target, k, maxHeap);
  54.         }
  55.     }
  56.  
  57.     public static void main(String args[]) {
  58.         Node root = new Node(1);
  59.         Node n_2 = new Node(2);
  60.         Node n_3 = new Node(3);
  61.         Node n_4 = new Node(4);
  62.         Node n_5 = new Node(5);
  63.         Node n_6 = new Node(6);
  64.         Node n_7 = new Node(7);
  65.         Node n_8 = new Node(8);
  66.         Node n_9 = new Node(9);
  67.         Node n_10 = new Node(10);
  68.  
  69.  
  70.         root.left = n_2;
  71.         root.right = n_3;
  72.  
  73.         n_2.left = n_4;
  74.         n_2.right = n_5;
  75.  
  76.         n_3.left = n_6;
  77.         n_3.right = n_7;
  78.  
  79.         n_4.left = n_8;
  80.         n_4.right = n_9;
  81.  
  82.         n_5.right = n_10;
  83.  
  84.         System.out.println(returnKClosestNodesToTarget(root, 2, 7));
  85.  
  86.     }
  87.  
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement