You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

396 lines
8.1 KiB
Java

/**
* Java Program to Implement Ternary-Heap
*/
import java.util.Scanner;
import java.util.Arrays;
import java.util.NoSuchElementException;
/** Class Ternary Heap **/
class TernaryHeap
{
private int d;
private int heapSize;
private int[] heap;
/** Constructor **/
public TernaryHeap (int capacity, int numChild)
{
heapSize = 0;
d = numChild;
heap = new int[capacity + 1];
Arrays.fill(heap, -1);
}
/** Function to check if heap is empty **/
public boolean isEmpty( )
{
return heapSize == 0;
}
/** Check if heap is full **/
public boolean isFull( )
{
return heapSize == heap.length;
}
/** Clear heap */
public void clear( )
{
heapSize = 0;
}
/** Function to get index parent of i **/
private int parent(int i)
{
return (i - 1)/d;
}
/** Function to get index of k th child of i **/
private int kthChild(int i, int k)
{
return d * i + k;
}
/** Function to insert element */
public void insert(int x)
{
if (isFull( ) )
throw new NoSuchElementException("Overflow Exception");
/** Percolate up **/
heap[heapSize++] = x;
heapifyUp(heapSize - 1);
}
/** Function to find least element **/
public int findMin( )
{
if (isEmpty() )
throw new NoSuchElementException("Underflow Exception");
return heap[0];
}
/** Function to delete element at an index **/
public int delete(int ind)
{
if (isEmpty() )
throw new NoSuchElementException("Underflow Exception");
int keyItem = heap[ind];
heap[ind] = heap[heapSize - 1];
heapSize--;
heapifyDown(ind);
return keyItem;
}
/** Function heapifyUp **/
private void heapifyUp(int childInd)
{
int tmp = heap[childInd];
while (childInd > 0 && tmp < heap[parent(childInd)])
{
heap[childInd] = heap[ parent(childInd) ];
childInd = parent(childInd);
}
heap[childInd] = tmp;
}
/** Function heapifyDown **/
private void heapifyDown(int ind)
{
int child;
int tmp = heap[ ind ];
while (kthChild(ind, 1) < heapSize)
{
child = minChild(ind);
if (heap[child] < tmp)
heap[ind] = heap[child];
else
break;
ind = child;
}
heap[ind] = tmp;
}
/** Function to get smallest child **/
private int minChild(int ind)
{
int bestChild = kthChild(ind, 1);
int k = 2;
int pos = kthChild(ind, k);
while ((k <= d) && (pos < heapSize))
{
if (heap[pos] < heap[bestChild])
bestChild = pos;
pos = kthChild(ind, k++);
}
return bestChild;
}
/** Function to print heap **/
public void printHeap()
{
System.out.print("\nHeap = ");
for (int i = 0; i < heapSize; i++)
System.out.print(heap[i] +" ");
System.out.println();
}
}
/** Class TernaryHeapTest **/
public class TernaryHeapTest
{
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);
System.out.println("Ternary Heap Test\n\n");
System.out.println("Enter size and no of nodes each child has");
/** Make object of TernaryHeapHeap **/
TernaryHeap th = new TernaryHeap(scan.nextInt(), scan.nextInt() );
char ch;
/** Perform Ternary Heap operations **/
do
{
System.out.println("\nTernary Heap Operations\n");
System.out.println("1. insert ");
System.out.println("2. delete");
System.out.println("3. check full");
System.out.println("4. check empty");
System.out.println("5. clear");
boolean chk;
int choice = scan.nextInt();
switch (choice)
{
case 1 :
try
{
System.out.println("Enter integer element to insert");
th.insert( scan.nextInt() );
}
catch (Exception e)
{
System.out.println(e.getMessage() );
}
break;
case 2 :
try
{
System.out.println("Enter delete position");
th.delete(scan.nextInt() - 1);
}
catch (Exception e)
{
System.out.println(e.getMessage() );
}
break;
case 3 :
System.out.println("Full status = "+ th.isFull());
break;
case 4 :
System.out.println("Empty status = "+ th.isEmpty());
break;
case 5 :
th.clear();
System.out.println("Heap Cleared\n");
break;
default :
System.out.println("Wrong Entry \n ");
break;
}
/** Display heap **/
th.printHeap();
System.out.println("\nDo you want to continue (Type y or n) \n");
ch = scan.next().charAt(0);
}
while (ch == 'Y'|| ch == 'y');
}
}
/*
Enter size and no of nodes each child has
3 3
Ternary Heap Operations
1. insert
2. delete
3. check full
4. check empty
5. clear
1
Enter integer element to insert
57
Heap = 57
Do you want to continue (Type y or n)
y
Ternary Heap Operations
1. insert
2. delete
3. check full
4. check empty
5. clear
1
Enter integer element to insert
17
Heap = 17 57
Do you want to continue (Type y or n)
y
Ternary Heap Operations
1. insert
2. delete
3. check full
4. check empty
5. clear
1
Enter integer element to insert
19
Heap = 17 57 19
Do you want to continue (Type y or n)
y
Ternary Heap Operations
1. insert
2. delete
3. check full
4. check empty
5. clear
1
Enter integer element to insert
7
Heap = 7 57 19 17
Do you want to continue (Type y or n)
y
Ternary Heap Operations
1. insert
2. delete
3. check full
4. check empty
5. clear
1
Enter integer element to insert
24
Overflow Exception
Heap = 7 57 19 17
Do you want to continue (Type y or n)
y
Ternary Heap Operations
1. insert
2. delete
3. check full
4. check empty
5. clear
2
Enter delete position
2
Heap = 7 17 19
Do you want to continue (Type y or n)
y
Ternary Heap Operations
1. insert
2. delete
3. check full
4. check empty
5. clear
2
Enter delete position
1
Heap = 17 19
Do you want to continue (Type y or n)
y
Ternary Heap Operations
1. insert
2. delete
3. check full
4. check empty
5. clear
2
Enter delete position
2
Heap = 17
Do you want to continue (Type y or n)
y
Ternary Heap Operations
1. insert
2. delete
3. check full
4. check empty
5. clear
4
Empty status = false
Heap = 17
Do you want to continue (Type y or n)
y
Ternary Heap Operations
1. insert
2. delete
3. check full
4. check empty
5. clear
5
Heap Cleared
Heap =
Do you want to continue (Type y or n)
y
Ternary Heap Operations
1. insert
2. delete
3. check full
4. check empty
5. clear
4
Empty status = true
Heap =
Do you want to continue (Type y or n)
n