VSDevelopers, Algorithms Coliseum

Priority Queue Maximum


/*Copyrights to vsdevelopers.io*/
/*For more programs visit vsdevelopers.io */
/*Java program for implementing operations on Max Priority Queue*/
import java.util.Scanner;

public class VSDMaxPriorityQueue {
	static Scanner sc = new Scanner(System.in);
	static int size = 0;

	// Class to hold the structure of node in a tree
	public static class Node {
		int data;// Holds the value of node
		Node left;// Holds the left pointer of node
		Node right;// Holds the right pointer of node
		// Default constructor

		Node(int data) {
			this.data = data;
			this.left = this.right = null;
		}
	}

	// Root node
	public static Node root = null;
	// Variable to hold count of left nodes
	public static int leftcount = 0;
	// Variable to hold count of right nodes
	public static int rightcount = 0;
	// Variable to Maintain count of nodes in priority queue for appropriate
	// deletion
	public static int deletecount = 0;
	// Varaible to hold the appropriate child node for deletion
	public static Node deletenode = null;
	// Variable to hold the parent of child to be deleted
	public static Node parent = null;

	// Method to Build priority queue along with maintanence of complete binary tree
	public static Node VSDbuildHeap(Node root, Node newNode) {
		if (root == null)
			root = newNode;// Null check
		else if (root.left != null && root.right != null)// Checking whether both left and right children are present
															// for the root
		{
			leftcount = VSDsubtreeCount(root.left);// Getting left nodes count from the left of current root
			rightcount = VSDsubtreeCount(root.right);// Getting right nodes count from the right of current root

			int height = VSDfindHeight(root);// Getting height of tree
			// Checking for the correct position to insert
			if (leftcount < (VSDexpectedCount(height) / 2)) {
				VSDbuildHeap(root.left, newNode);
			} else if (leftcount == rightcount)
				VSDbuildHeap(root.left, newNode);
			else
				VSDbuildHeap(root.right, newNode);
		} else if (root.left == null) {
			root.left = newNode;

		} else if (root.right == null) {
			root.right = newNode;

		}

		return root;
	}

	// Function to maintain max priority queue properties
	public static Node VSDHeapify(Node current) {
		if (current.left != null)
			current.left = VSDHeapify(current.left);
		if (current.right != null)
			current.right = VSDHeapify(current.right);
		if (current.left != null && current.left.data > current.data) {
			int temp = current.left.data;
			current.left.data = current.data;
			current.data = temp;

		}
		if (current.right != null && current.right.data > current.data) {
			int temp = current.right.data;
			current.right.data = current.data;
			current.data = temp;
		}
		return current;
	}

	// Function to return the expected node count for given height
	public static int VSDexpectedCount(int h) {
		int count = 0;
		while (h >= 0) {
			count += Math.pow(2, h);
			h--;
		}
		return count;
	}

	// Function to return the node count for given subtree
	public static int VSDsubtreeCount(Node current) {
		int leftheight = 0;// variable to hold height of left subtree
		int rightheight = 0;// variable to hold height of right sub tree
		// Traversing to the left subtree to find max height
		if (current.left != null) {
			leftheight = VSDsubtreeCount(current.left);
		}
		// Traversing to the right subtree to find max height
		if (current.right != null) {
			rightheight = VSDsubtreeCount(current.right);
		}
		// selecting maximum height and adding 1 for root's height
		int count = rightheight + leftheight + 1;
		return count;
	}

	// Function to return the height of tree
	public static int VSDfindHeight(Node current) {
		if (current == null)
			return -1;
		else {
			int lh = VSDfindHeight(current.left);
			int rh = VSDfindHeight(current.right);

			if (lh > rh)
				return (lh + 1);
			else
				return (rh + 1);
		}
	}

//Function to display elements in max priority queue using inorder traversal
	public static void VSDinorder(Node root) {
		if (root.left != null)
			VSDinorder(root.left);
		System.out.println(root.data);
		if (root.right != null)
			VSDinorder(root.right);
	}

	/* Function to choose the most recently inserted element based on count */
	public static void VSDchooseNode(Node current, int level, int size) {
		if (current == null) {
			return;
		}
		if (level == 0) {
			deletecount++;
			if (deletecount == size / 2) {
				parent = current;
			}
			if (deletecount == size) {
				deletenode = current;
				return;
			}
		} else if (level > 0) {

			VSDchooseNode(current.left, level - 1, size);
			VSDchooseNode(current.right, level - 1, size);
		}

	}

//Function to delete the root node from the priority queue
	public static Node VSDdeleteNode(Node root, int height, int size) {
		// Obtain correct child node to replace with root
		for (int i = 0; i <= height; i++) {
			VSDchooseNode(root, i, size);
		}
		int temp = root.data;
		root.data = deletenode.data;
		deletenode.data = temp;
		// Deleting the node
		if (parent.right != null)
			parent.right = null;
		else
			parent.left = null;
		// calling heapify to maintain max priority queue properties
		root = VSDHeapify(root);
		return root;
	}

	public static void VSDuserInput() {
		System.out.println("Please Enter Priority Queue operation from:");
		System.out.println("Enqueue , Dequeue");
		String choice = sc.next();
		switch (choice) {
		case "Enqueue":
		case "enqueue":
			System.out.println("Please Enter Element to insert:");
			int element = sc.nextInt();
			Node n = new Node(element);
			root = VSDbuildHeap(root, n);
			root = VSDHeapify(root);// Calling function to maintain max priority queue properties
			size++;
			System.out.println("After Insertion:");
			VSDinorder(root);
			break;
		case "dequeue":
		case "Dequeue":
			if (root != null) {
				deletecount = 0;
				System.out.println("The deleted element is:" + root.data);
				int height = VSDfindHeight(root);
				if (height == 0)
					root = null;
				else {
					root = VSDdeleteNode(root, height, size);
					size--;
				}
			} else
				System.out.println("No elements to dequeue!!");

			break;
		}
		VSDuserChoice();
	}

	public static void VSDuserChoice() {
		System.out.println("For performing operations enter y else enter n");
		char ch = sc.next().charAt(0);
		if (ch == 'Y' || ch == 'y')
			VSDuserInput();
		else
			return;
	}

	public static void main(String args[]) {
		VSDuserInput();
	}
}
loader