440 lines
9.1 KiB
Java
440 lines
9.1 KiB
Java
/*This is a Java Program to implement Pagoda. A pagoda is a priority queue implemented with a variant of a binary tree. The root points to its children, as in a binary tree. Every other node points back to its parent and down to its leftmost (if it is a right child) or rightmost (if it is a left child) descendant leaf. The basic operation is merge or meld, which maintains the heap property. An element is inserted by merging it as a singleton. The root is removed by merging its right and left children. Merging is bottom-up, merging the leftmost edge of one with the rightmost edge of the other.*/
|
|
|
|
/*
|
|
* Java Program to Implement Pagoda
|
|
*/
|
|
|
|
import java.util.Scanner;
|
|
|
|
/* Class PNode */
|
|
class PNode
|
|
{
|
|
PNode left, right;
|
|
int data;
|
|
|
|
/* Constructor */
|
|
public PNode(int val)
|
|
{
|
|
data = val;
|
|
left = null;
|
|
right = null;
|
|
}
|
|
}
|
|
|
|
/* Class Pagoda */
|
|
class Pagoda
|
|
{
|
|
private PNode root;
|
|
|
|
/* Constructor */
|
|
public Pagoda()
|
|
{
|
|
root = null;
|
|
}
|
|
/* Function to check if empty */
|
|
public boolean isEmpty()
|
|
{
|
|
return root == null;
|
|
}
|
|
/* Function to clear */
|
|
public void makeEmpty()
|
|
{
|
|
root = null;
|
|
}
|
|
/* Function to insert value */
|
|
public void insert(int val)
|
|
{
|
|
PNode newNode = new PNode(val);
|
|
root = insert(newNode, root);
|
|
}
|
|
private PNode insert(PNode newNode, PNode pq)
|
|
{
|
|
newNode.left = newNode;
|
|
newNode.right = newNode;
|
|
return (merge(pq, newNode));
|
|
}
|
|
/* Function to merge two nodes */
|
|
private PNode merge(PNode a, PNode b)
|
|
{
|
|
PNode bota, botb, r, temp;
|
|
if (a == null)
|
|
return b;
|
|
else if (b == null)
|
|
return a;
|
|
else
|
|
{
|
|
bota = a.right;
|
|
a.right = null;
|
|
/* bottom of b's leftmost edge */
|
|
botb = b.left;
|
|
b.left = null;
|
|
r = null;
|
|
/* Merging loop */
|
|
while ( bota != null && botb != null )
|
|
if ( bota.data < botb.data )
|
|
{
|
|
temp = bota.right;
|
|
if ( r == null )
|
|
bota.right = bota;
|
|
else
|
|
{
|
|
bota.right = r.right;
|
|
r.right = bota;
|
|
}
|
|
r = bota;
|
|
bota = temp;
|
|
}
|
|
else
|
|
{
|
|
temp = botb.left;
|
|
if ( r == null )
|
|
botb.left = botb;
|
|
else
|
|
{
|
|
botb.left = r.left;
|
|
r.left = botb;
|
|
}
|
|
r = botb;
|
|
botb = temp;
|
|
}
|
|
/* one edge is exhausted, finish merge */
|
|
if ( botb == null )
|
|
{
|
|
a.right = r.right;
|
|
r.right = bota;
|
|
return( a );
|
|
}
|
|
else
|
|
{
|
|
b.left = r.left;
|
|
r.left = botb;
|
|
return( b );
|
|
}
|
|
}
|
|
}
|
|
/* Function to delete */
|
|
public void delete()
|
|
{
|
|
root = delete(root);
|
|
}
|
|
private PNode delete(PNode pq)
|
|
{
|
|
PNode le, ri;
|
|
/* Deletion on empty queue */
|
|
if ( pq == null )
|
|
{
|
|
System.out.println("Empty");
|
|
return null;
|
|
}
|
|
else
|
|
{
|
|
/* Find left descendant of root */
|
|
if ( pq.left == pq )
|
|
le = null;
|
|
else
|
|
{
|
|
le = pq.left;
|
|
while ( le.left != pq )
|
|
le = le.left;
|
|
le.left = pq.left;
|
|
}
|
|
/* Find right descendant of root */
|
|
if ( pq.right == pq )
|
|
ri = null;
|
|
else
|
|
{
|
|
ri = pq.right;
|
|
while ( ri.right != pq )
|
|
ri = ri.right;
|
|
ri.right = pq.right;
|
|
}
|
|
/* merge them */
|
|
return merge(le, ri);
|
|
}
|
|
}
|
|
/* Function to print root value */
|
|
public void printPagodaRoot()
|
|
{
|
|
if (root != null)
|
|
System.out.print(root.data +"\n");
|
|
else
|
|
System.out.print("Empty\n");
|
|
}
|
|
}
|
|
|
|
|
|
/* Class PagodaTest */
|
|
public class PagodaTest
|
|
{
|
|
public static void main(String[] args)
|
|
{
|
|
Scanner scan = new Scanner(System.in);
|
|
/* Creating object of Pagoda */
|
|
Pagoda pgda = new Pagoda();
|
|
System.out.println("Pagoda Test\n");
|
|
char ch;
|
|
/* Perform tree operations */
|
|
do
|
|
{
|
|
System.out.println("\nPagoda Operations\n");
|
|
System.out.println("1. insert ");
|
|
System.out.println("2. delete");
|
|
System.out.println("3. check empty");
|
|
System.out.println("4. clear");
|
|
int choice = scan.nextInt();
|
|
switch (choice)
|
|
{
|
|
case 1 :
|
|
System.out.println("Enter integer element to insert");
|
|
pgda.insert( scan.nextInt() );
|
|
break;
|
|
case 2 :
|
|
pgda.delete();
|
|
break;
|
|
case 3 :
|
|
System.out.println("Empty status = "+ pgda.isEmpty());
|
|
break;
|
|
case 4 :
|
|
System.out.println("\nCleared");
|
|
pgda.makeEmpty();
|
|
break;
|
|
default :
|
|
System.out.println("Wrong Entry \n ");
|
|
break;
|
|
}
|
|
/* Display tree */
|
|
System.out.print("\nRoot Element : ");
|
|
pgda.printPagodaRoot();
|
|
System.out.println("\nDo you want to continue (Type y or n) \n");
|
|
ch = scan.next().charAt(0);
|
|
}
|
|
while (ch == 'Y'|| ch == 'y');
|
|
}
|
|
}
|
|
|
|
/*
|
|
|
|
Pagoda Operations
|
|
|
|
1. insert
|
|
2. delete
|
|
3. check empty
|
|
4. clear
|
|
1
|
|
Enter integer element to insert
|
|
45
|
|
|
|
Root Element : 45
|
|
|
|
Do you want to continue (Type y or n)
|
|
|
|
y
|
|
|
|
Pagoda Operations
|
|
|
|
1. insert
|
|
2. delete
|
|
3. check empty
|
|
4. clear
|
|
1
|
|
Enter integer element to insert
|
|
23
|
|
|
|
Root Element : 45
|
|
|
|
Do you want to continue (Type y or n)
|
|
|
|
y
|
|
|
|
Pagoda Operations
|
|
|
|
1. insert
|
|
2. delete
|
|
3. check empty
|
|
4. clear
|
|
1
|
|
Enter integer element to insert
|
|
57
|
|
|
|
Root Element : 57
|
|
|
|
Do you want to continue (Type y or n)
|
|
|
|
y
|
|
|
|
Pagoda Operations
|
|
|
|
1. insert
|
|
2. delete
|
|
3. check empty
|
|
4. clear
|
|
1
|
|
Enter integer element to insert
|
|
19
|
|
|
|
Root Element : 57
|
|
|
|
Do you want to continue (Type y or n)
|
|
|
|
y
|
|
|
|
Pagoda Operations
|
|
|
|
1. insert
|
|
2. delete
|
|
3. check empty
|
|
4. clear
|
|
1
|
|
Enter integer element to insert
|
|
24
|
|
|
|
Root Element : 57
|
|
|
|
Do you want to continue (Type y or n)
|
|
|
|
y
|
|
|
|
Pagoda Operations
|
|
|
|
1. insert
|
|
2. delete
|
|
3. check empty
|
|
4. clear
|
|
1
|
|
Enter integer element to insert
|
|
93
|
|
|
|
Root Element : 93
|
|
|
|
Do you want to continue (Type y or n)
|
|
|
|
y
|
|
|
|
Pagoda Operations
|
|
|
|
1. insert
|
|
2. delete
|
|
3. check empty
|
|
4. clear
|
|
1
|
|
Enter integer element to insert
|
|
87
|
|
|
|
Root Element : 93
|
|
|
|
Do you want to continue (Type y or n)
|
|
|
|
y
|
|
|
|
Pagoda Operations
|
|
|
|
1. insert
|
|
2. delete
|
|
3. check empty
|
|
4. clear
|
|
2
|
|
|
|
Root Element : 87
|
|
|
|
Do you want to continue (Type y or n)
|
|
|
|
y
|
|
|
|
Pagoda Operations
|
|
|
|
1. insert
|
|
2. delete
|
|
3. check empty
|
|
4. clear
|
|
2
|
|
|
|
Root Element : 57
|
|
|
|
Do you want to continue (Type y or n)
|
|
|
|
y
|
|
|
|
Pagoda Operations
|
|
|
|
1. insert
|
|
2. delete
|
|
3. check empty
|
|
4. clear
|
|
2
|
|
|
|
Root Element : 45
|
|
|
|
Do you want to continue (Type y or n)
|
|
|
|
y
|
|
|
|
Pagoda Operations
|
|
|
|
1. insert
|
|
2. delete
|
|
3. check empty
|
|
4. clear
|
|
2
|
|
|
|
Root Element : 24
|
|
|
|
Do you want to continue (Type y or n)
|
|
|
|
y
|
|
|
|
Pagoda Operations
|
|
|
|
1. insert
|
|
2. delete
|
|
3. check empty
|
|
4. clear
|
|
2
|
|
|
|
Root Element : 23
|
|
|
|
Do you want to continue (Type y or n)
|
|
|
|
y
|
|
|
|
Pagoda Operations
|
|
|
|
1. insert
|
|
2. delete
|
|
3. check empty
|
|
4. clear
|
|
2
|
|
|
|
Root Element : 19
|
|
|
|
Do you want to continue (Type y or n)
|
|
|
|
y
|
|
|
|
Pagoda Operations
|
|
|
|
1. insert
|
|
2. delete
|
|
3. check empty
|
|
4. clear
|
|
2
|
|
|
|
Root Element : Empty
|
|
|
|
Do you want to continue (Type y or n)
|
|
|
|
y
|
|
|
|
Pagoda Operations
|
|
|
|
1. insert
|
|
2. delete
|
|
3. check empty
|
|
4. clear
|
|
3
|
|
Empty status = true
|
|
|
|
Root Element : Empty
|
|
|
|
Do you want to continue (Type y or n)
|
|
|
|
n |