package com.interview.graph;
import java.util.ArrayList;
import java.util.List;
public class BinaryMaxHeap<T> {
private List<Node> allNodes = new ArrayList<Node>();
class Node {
int weight;
T data;
}
public void add(int weight,T data) {
Node node = new Node();
node.weight = weight;
node.data = data;
allNodes.add(node);
int size = allNodes.size();
int current = size - 1;
int parentIndex = (current - 1) / 2;
while (parentIndex >= 0) {
Node parentNode = allNodes.get(parentIndex);
Node currentNode = allNodes.get(current);
if (parentNode.weight < currentNode.weight) {
swap(parentNode,currentNode);
current = parentIndex;
parentIndex = (parentIndex - 1) / 2;
} else {
break;
}
}
}
private void swap(Node node1,Node node2){
int weight = node1.weight;
T data = node1.data;
node1.data = node2.data;
node1.weight = node2.weight;
node2.data = data;
node2.weight = weight;
}
public T max(){
return allNodes.get(0).data;
}
public boolean empty(){
return allNodes.size() == 0;
}
public T extractMap(){
int size = allNodes.size() -1;
T max = allNodes.get(0).data;
int lastNodeWeight = allNodes.get(size).weight;
allNodes.get(0).weight = lastNodeWeight;
allNodes.get(0).data = allNodes.get(size).data;
allNodes.remove(size);
int currentIndex = 0;
size--;
while(true){
int left = 2*currentIndex + 1;
int right = 2*currentIndex + 2;
if(left > size){
break;
}
if(right > size){
right = left;
}
int largerIndex = allNodes.get(left).weight >= allNodes.get(right).weight ? left : right;
if(allNodes.get(currentIndex).weight < allNodes.get(largerIndex).weight){
swap(allNodes.get(currentIndex),allNodes.get(largerIndex));
currentIndex = largerIndex;
}else{
break;
}
}
return max;
}
public void printHeap(){
for(Node n : allNodes){
System.out.println(n.weight + " " + n.data);
}
}
public static void main(String args[]){
BinaryMaxHeap<String> heap = new BinaryMaxHeap<String>();
heap.add(3, "Tushar");
heap.add(4, "Ani");
heap.add(8, "Vijay");
heap.add(10, "Pramila");
heap.add(5, "Roy");
heap.add(6, "NTF");
heap.printHeap();
}
}