Advertisement
Guest User

Untitled

a guest
Jan 26th, 2020
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.34 KB | None | 0 0
  1. template<typename T>
  2. class Node
  3. {
  4. public:
  5.     T key;
  6.     Node<T>* left;
  7.     Node<T>* right;
  8.     int height;
  9. };
  10.  
  11. int max(int a, int b)
  12. {
  13.     return (a > b) ? a : b;
  14. }
  15.  
  16. template<typename T>
  17. int height(Node<T>* N)
  18. {
  19.     if (N == nullptr)
  20.     {
  21.         return 0;
  22.     }
  23.     return N->height;
  24. }
  25.  
  26. template<typename T>
  27. Node<T>* newNode(T key)
  28. {
  29.     Node<T>* node = new Node<T>();
  30.     node->key = key;
  31.     node->left = nullptr;
  32.     node->right = nullptr;
  33.     node->height = 1;
  34.     return(node);
  35. }
  36.  
  37. template<typename T>
  38. Node<T>* rightRotate(Node<T>* root)
  39. {
  40.     Node<T>* newRoot = root->left;
  41.     Node<T>* newRoot2 = newRoot->right;
  42.     newRoot->right = root;
  43.     root->left = newRoot2;
  44.     root->height = max(height(root->left), height(root->right)) + 1;
  45.     newRoot->height = max(height(newRoot->left), height(newRoot->right)) + 1;
  46.     return newRoot;
  47. }
  48.  
  49. template<typename T>
  50. Node<T>* leftRotate(Node<T>* root)
  51. {
  52.     Node<T>* newRoot = root->right;
  53.     Node<T>* newRoot2 = newRoot->left;
  54.     newRoot->left = root;
  55.     root->right = newRoot2;
  56.     root->height = max(height(root->left), height(root->right)) + 1;
  57.     newRoot->height = max(height(newRoot->left), height(newRoot->right)) + 1;
  58.  
  59.     return newRoot;
  60. }
  61.  
  62. template<typename T>
  63. int getBalance(Node<T>* N)
  64. {
  65.     if (N == nullptr)
  66.     {
  67.         return 0;
  68.     }
  69.     return height(N->left) - height(N->right);
  70. }
  71.  
  72. template<typename T>
  73. Node<T>* insert(Node<T>* node, int key)
  74. {
  75.     if (node == NULL)
  76.     {
  77.         return(newNode(key));
  78.     }
  79.     if (key < node->key)
  80.     {
  81.         node->left = insert(node->left, key);
  82.     }
  83.     else if (key > node->key)
  84.     {
  85.         node->right = insert(node->right, key);
  86.     }
  87.     else
  88.     {
  89.         return node;
  90.     }
  91.     node->height = 1 + max(height(node->left), height(node->right));
  92.  
  93.     int balance = getBalance(node);
  94.  
  95.     if (balance > 1 && key < node->left->key)
  96.     {
  97.         return rightRotate(node);
  98.     }
  99.     if (balance < -1 && key > node->right->key)
  100.     {
  101.         return leftRotate(node);
  102.     }
  103.     if (balance > 1 && key > node->left->key)
  104.     {
  105.         node->left = leftRotate(node->left);
  106.         return rightRotate(node);
  107.     }
  108.     if (balance < -1 && key < node->right->key)
  109.     {
  110.         node->right = rightRotate(node->right);
  111.         return leftRotate(node);
  112.     }
  113.     return node;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement