Question

PRIORITY QUEUE USING AVL TREE [ c++ ] Implement a PriorityQueue where we will store the...

PRIORITY QUEUE USING AVL TREE [ c++ ]

Implement a PriorityQueue where we will store the underlying data as an AVL Tree. For each of the fundamental operations of a PriorityQueue, explain briefly how you would implement it with an AVL Tree. If something is a standard AVL tree operation, such as a re-balance, you need only refer to it. The operations are:

1. insertion

2. extractMin()

3.min()

4.extractMax()

5.Max()

0 0
Add a comment Improve this question Transcribed image text
Answer #1

The operations:-

1> INSERTION:-

To make sure that the given tree remains AVL after every insertion, you must augment the standard BST insert operation to perform some re-balancing. Following are two basic operations that can be performed to re-balance a BST without violating the BST property (keys(left) < key(root) < keys(right)).
1) Left Rotation
2) Right Rotation

T1, T2 and T3 are subtrees of the tree 
rooted with y (on the left side) or x (on 
the right side)           
     y                               x
    / \     Right Rotation          /  \
   x   T3   - - - - - - - >        T1   y 
  / \       < - - - - - - -            / \
 T1  T2     Left Rotation            T2  T3
Keys in both of the above trees follow the 
following order 
 keys(T1) < key(x) < keys(T2) < key(y) < keys(T3)
So BST property is not violated anywhere.

Steps to follow for insertion
Let the newly inserted node be w
1) Perform standard BST insert for w.
2) Starting from w, travel up and find the first unbalanced node. Let z be the first unbalanced node, y be the child of z that comes on the path from w to z and x be the grandchild of z that comes on the path from w to z.
3) Re-balance the tree by performing appropriate rotations on the subtree rooted with z. There can be 4 possible cases that need to be handled as x, y and z can be arranged in 4 ways. Following are the possible 4 arrangements:
a) y is left child of z and x is left child of y (Left Left Case)
b) y is left child of z and x is the right child of y (Left-Right Case)
c) y is the right child of z and x is the right child of y (Right Right Case)
d) y is the right child of z and x is left child of y (Right Left Case)

Following are the operations to be performed in above mentioned 4 cases. In all of the cases, we only need to re-balance the subtree rooted with z and the complete tree becomes balanced as the height of subtree (After appropriate rotations) rooted with z becomes the same as it was before insertion.

2> EXTRA MINI():-

this basically return you the least valued element in an AVL tree

3> MIN():-

this method returns the least valued element in the corresponding segment of the binary tree

4>EXTRA MAX():-

this basically returns you the highest valued element in an AVL tree.

5> MAN():-

this method returns the highest valued element in the corresponding segment of the binary tree.

here below is a code that may help you to understand the creation of AVL tree.---

<------------------------------------------code start-------------------------------------------->

// C++ program to insert a node in AVL tree
#include<bits/stdc++.h>
using namespace std;

// An AVL tree node
class Node
{
   public:
   int key;
   Node *left;
   Node *right;
   int height;
};

// A utility function to get maximum
// of two integers
int max(int a, int b);

// A utility function to get the
// height of the tree
int height(Node *N)
{
   if (N == NULL)
       return 0;
   return N->height;
}

// A utility function to get maximum
// of two integers
int max(int a, int b)
{
   return (a > b)? a : b;
}

/* Helper function that allocates a
new node with the given key and
NULL left and right pointers. */
Node* newNode(int key)
{
   Node* node = new Node();
   node->key = key;
   node->left = NULL;
   node->right = NULL;
   node->height = 1; // new node is initially
                   // added at leaf
   return(node);
}

// A utility function to right
// rotate subtree rooted with y
// See the diagram given above.
Node *rightRotate(Node *y)
{
   Node *x = y->left;
   Node *T2 = x->right;

   // Perform rotation
   x->right = y;
   y->left = T2;

   // Update heights
   y->height = max(height(y->left),
                   height(y->right)) + 1;
   x->height = max(height(x->left),
                   height(x->right)) + 1;

   // Return new root
   return x;
}

// A utility function to left
// rotate subtree rooted with x
// See the diagram given above.
Node *leftRotate(Node *x)
{
   Node *y = x->right;
   Node *T2 = y->left;

   // Perform rotation
   y->left = x;
   x->right = T2;

   // Update heights
   x->height = max(height(x->left),     
                   height(x->right)) + 1;
   y->height = max(height(y->left),
                   height(y->right)) + 1;

   // Return new root
   return y;
}

// Get Balance factor of node N
int getBalance(Node *N)
{
   if (N == NULL)
       return 0;
   return height(N->left) - height(N->right);
}

// Recursive function to insert a key
// in the subtree rooted with node and
// returns the new root of the subtree.
Node* insert(Node* node, int key)
{
   /* 1. Perform the normal BST insertion */
   if (node == NULL)
       return(newNode(key));

   if (key < node->key)
       node->left = insert(node->left, key);
   else if (key > node->key)
       node->right = insert(node->right, key);
   else // Equal keys are not allowed in BST
       return node;

   /* 2. Update height of this ancestor node */
   node->height = 1 + max(height(node->left),
                       height(node->right));

   /* 3. Get the balance factor of this ancestor
       node to check whether this node became
       unbalanced */
   int balance = getBalance(node);

   // If this node becomes unbalanced, then
   // there are 4 cases

   // Left Left Case
   if (balance > 1 && key < node->left->key)
       return rightRotate(node);

   // Right Right Case
   if (balance < -1 && key > node->right->key)
       return leftRotate(node);

   // Left Right Case
   if (balance > 1 && key > node->left->key)
   {
       node->left = leftRotate(node->left);
       return rightRotate(node);
   }

   // Right Left Case
   if (balance < -1 && key < node->right->key)
   {
       node->right = rightRotate(node->right);
       return leftRotate(node);
   }

   /* return the (unchanged) node pointer */
   return node;
}

// A utility function to print preorder
// traversal of the tree.
// The function also prints height
// of every node
void preOrder(Node *root)
{
   if(root != NULL)
   {
       cout << root->key << " ";
       preOrder(root->left);
       preOrder(root->right);
   }
}

// Driver Code
int main()
{
   Node *root = NULL;
  
   /* Constructing tree given in
   the above figure */
   root = insert(root, 10);
   root = insert(root, 20);
   root = insert(root, 30);
   root = insert(root, 40);
   root = insert(root, 50);
   root = insert(root, 25);
  
   /* The constructed AVL Tree would be
               30
           / \
           20 40
           / \ \
       10 25 50
   */
   cout << "Preorder traversal of the "
           "constructed AVL tree is \n";
   preOrder(root);
  
   return 0;
}

<------------------------------------------code end-------------------------------------------->

Add a comment
Know the answer?
Add Answer to:
PRIORITY QUEUE USING AVL TREE [ c++ ] Implement a PriorityQueue where we will store the...
Your Answer:

Post as a guest

Your Name:

What's your source?

Earn Coins

Coins can be redeemed for fabulous gifts.

Not the answer you're looking for? Ask your own homework help question. Our experts will answer your question WITHIN MINUTES for Free.
Similar Homework Help Questions
  • In class, we discussed the priority queue (PQ) ADT implemented using min-heap. In a min-heap, the...

    In class, we discussed the priority queue (PQ) ADT implemented using min-heap. In a min-heap, the element of the heap with the smallest key is the root of the binary tree. On the other hand, a max-heap has as root the element with the biggest key, and the relationship between the keys of a node and its parent is reversed of that of a min-heap. We also discussed an array-based implementation of heaps. In this assignment, your task is to...

  • The tree diagram below depicts a heap being used to implement a priority queue. Enqueue the...

    The tree diagram below depicts a heap being used to implement a priority queue. Enqueue the value 6 onto the priority queue, then execute a dequeue. After those two operations have been completed, what does the underlying array look like? List the elements in the resulting heap in the order in which they appear in the array, from left to right.

  • Write a program in Java to implement the max-priority queue using max-heap data structure. Implement the...

    Write a program in Java to implement the max-priority queue using max-heap data structure. Implement the max-heap data structure using an integer array of 10 cells. (Do not use Java in-built PriorityQueue class.) [In a max-heap, the root node and the intermediate node vales are always greater than their children.] First, take 10 integer values from the user and insert them in the max-priority queue. Then print the elements of the queue. After that, delete two elements from the queue...

  • A priority queue is a collection of items each having a priority. A priority queue supports three...

    A priority queue is a collection of items each having a priority. A priority queue supports three fundamental operations. You can ask a priority queue whether it is empty. You can insert an item into the priority queue with a given priority. You can remove the item from the priority queue that has the smallest priority. For example, suppose that you start with an empty priority queue and imagine performing the following steps. Insert item "one" with priority 10. Insert...

  • solving using C. Use a singly linked list to implement a priority queue with two operations:...

    solving using C. Use a singly linked list to implement a priority queue with two operations: enqueue and dequeue. Each node contains an integer value, a priority, and a pointer to the next node. The priority is a value between 1- 10 (where 10 is the highest priority). When a value is added to the queue, it is added with a value and priority. When a value is removed from the priority queue, the first element with the highest priority...

  • In C++ if needed, (Weight: 2096) Programming: Write a Compare function class that inserts Person objects in a priority queue based on the number of dependents a person has. The Person object with the...

    In C++ if needed, (Weight: 2096) Programming: Write a Compare function class that inserts Person objects in a priority queue based on the number of dependents a person has. The Person object with the largest number of dependents should be removed first. 3. Hint: In order to use the priority queue class, we need to pass in a structure that allows comparing the objects. If the max queue keeps track of primitive values (e.g. integers, strings), then the built-in C++...

  • Suppose we want to implement a circular queue using an array that has an initial capacity...

    Suppose we want to implement a circular queue using an array that has an initial capacity (maximum number of elements) MAX. A circular queue is like a regular queue except that elements can be enqueued or dequeued by wrapping around it. Assume we enqueue on the tail and dequeue from the head. An example circular queue with sample operations is shown below: head head tail head tail tail head Enqueue(9) a) Write a program in C that implements this circular...

  • 2. Short programming assignment. Implement a bottom-up mergesort that first sorts blocks of M elements using...

    2. Short programming assignment. Implement a bottom-up mergesort that first sorts blocks of M elements using insertion sort. Test your program with large sets of random data and determine what value of M works best. 3. The following refer to linked list mergesort Explain why mergesort is more suitable for linked lists than other sorting methods. a. Explain why mergesort is more suitable for linked lists than other b. Consider a file that is “mostly sorted.” Explain how the principles...

  • Goal: design and implement a dictionary. implement your dictionary using AVL tree . Problem​: Each entry...

    Goal: design and implement a dictionary. implement your dictionary using AVL tree . Problem​: Each entry in the dictionary is a pair: (word, meaning). Word is a one-word string, meaning can be a string of one or more words (it’s your choice of implementation, you can restrict the meaning to one-word strings). The dictionary is case-insensitive. It means “Book”, “BOOK”, “book” are all the same . Your dictionary application must provide its operations through the following menu (make sure that...

  • PYTHON QUESTION... Building a Binary Tree with extended Binary Search Tree and AVL tree. Create a...

    PYTHON QUESTION... Building a Binary Tree with extended Binary Search Tree and AVL tree. Create a class called MyTree with the methods __init__(x), getLeft(), getRight(), getData(), insert(x) and getHeight(). Each child should itself be a MyTree object. The height of a leaf node should be zero. The insert(x) method should return the node that occupies the original node's position in the tree. Create a class called MyBST that extends MyTree. Override the method insert(x) to meet the definitions of a...

ADVERTISEMENT
Free Homework Help App
Download From Google Play
Scan Your Homework
to Get Instant Free Answers
Need Online Homework Help?
Ask a Question
Get Answers For Free
Most questions answered within 3 hours.
ADVERTISEMENT
ADVERTISEMENT