Mega Code Archive

 
Categories / Java / Collections Data Structure
 

Demonstrates heaps

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Heap {   private Node[] heapArray;   private int maxSize; // size of array   private int currentSize; // number of nodes in array   public Heap(int mx) {     maxSize = mx;     currentSize = 0;     heapArray = new Node[maxSize]; // create array   }   public boolean isEmpty() {     return currentSize == 0;   }   public boolean insert(int key) {     if (currentSize == maxSize)       return false;     Node newNode = new Node(key);     heapArray[currentSize] = newNode;     trickleUp(currentSize++);     return true;   }    public void trickleUp(int index) {     int parent = (index - 1) / 2;     Node bottom = heapArray[index];     while (index > 0 && heapArray[parent].getKey() < bottom.getKey()) {       heapArray[index] = heapArray[parent]; // move it down       index = parent;       parent = (parent - 1) / 2;     }     heapArray[index] = bottom;   }   public Node remove() // delete item with max key   { // (assumes non-empty list)     Node root = heapArray[0];     heapArray[0] = heapArray[--currentSize];     trickleDown(0);     return root;   } // end remove()   public void trickleDown(int index) {     int largerChild;     Node top = heapArray[index]; // save root     while (index < currentSize / 2) // while node has at     { //    least one child,       int leftChild = 2 * index + 1;       int rightChild = leftChild + 1;       // find larger child       if (rightChild < currentSize           && // (rightChild exists?)           heapArray[leftChild].getKey() < heapArray[rightChild]               .getKey())         largerChild = rightChild;       else         largerChild = leftChild;       // top >= largerChild?       if (top.getKey() >= heapArray[largerChild].getKey())         break;       // shift child up       heapArray[index] = heapArray[largerChild];       index = largerChild; // go down     }     heapArray[index] = top; // root to index   }   public boolean change(int index, int newValue) {     if (index < 0 || index >= currentSize)       return false;     int oldValue = heapArray[index].getKey(); // remember old     heapArray[index].setKey(newValue); // change to new     if (oldValue < newValue)        trickleUp(index);      else       trickleDown(index);     return true;   }   public void displayHeap() {     System.out.print("heapArray: "); // array format     for (int m = 0; m < currentSize; m++)       if (heapArray[m] != null)         System.out.print(heapArray[m].getKey() + " ");       else         System.out.print("-- ");     int nBlanks = 32;     int itemsPerRow = 1;     int column = 0;     int j = 0; // current item     while (currentSize > 0) // for each heap item     {       if (column == 0) // first item in row?         for (int k = 0; k < nBlanks; k++)           // preceding blanks           System.out.print(' ');       // display item       System.out.print(heapArray[j].getKey());       if (++j == currentSize) // done?         break;       if (++column == itemsPerRow) // end of row?       {         nBlanks /= 2; // half the blanks         itemsPerRow *= 2; // twice the items         column = 0; // start over on         System.out.println(); //    new row       } else         // next item on row         for (int k = 0; k < nBlanks * 2 - 2; k++)           System.out.print(' '); // interim blanks     }    }   public static void main(String[] args) throws IOException {     int value, value2;     Heap h = new Heap(31); // make a Heap; max size 31     boolean success;     h.insert(70); // insert 10 items     h.insert(40);     h.insert(50);     h.insert(20);     h.insert(60);     h.insert(100);     h.insert(80);     h.insert(30);     h.insert(10);     h.insert(90);     h.displayHeap();     value = 100;     success = h.insert(value);     if (!success)       System.out.println("Can't insert; heap full");     if (!h.isEmpty())       h.remove();     else       System.out.println("Can't remove; heap empty");     value = 80;     value2 = 999;     success = h.change(value, value2);     if (!success)       System.out.println("Invalid index");   }   class Node {     private int data;      public Node(int key) {       data = key;     }     public int getKey() {       return data;     }     public void setKey(int id) {       data = id;     }   } }