Advertisement
Guest User

Untitled

a guest
Dec 8th, 2016
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.20 KB | None | 0 0
  1.  
  2. #pragma once
  3. #include <iostream>
  4. using namespace std;
  5.  
  6. template<typename DT>
  7. struct AVLNode {
  8.     DT datum;
  9.     struct AVLNode* left;
  10.     struct AVLNode* right;
  11. };
  12.  
  13. template<typename DT>
  14. class AVLTree {
  15. private:
  16.     AVLNode<DT>* root;
  17.     int height(AVLNode<DT>* node);
  18.     int diff(AVLNode<DT>* node);
  19.     AVLNode<DT>* rrRotation(AVLNode<DT>* parent);
  20.     AVLNode<DT>* llRotation(AVLNode<DT>* parent);
  21.     AVLNode<DT>* lrRotation(AVLNode<DT>* parent);
  22.     AVLNode<DT>* rlRotation(AVLNode<DT>* parent);
  23.     AVLNode<DT>* balance(AVLNode<DT>* node);
  24.     AVLNode<DT>* remove(DT datum, AVLNode<DT>* node);
  25.     AVLNode<DT>* insert(AVLNode<DT>* node, DT datum);
  26.     void display(AVLNode<DT>* node, int level);
  27.     void inOrder(AVLNode<DT>* node);
  28.     void preOrder(AVLNode<DT>* node);
  29.     void postOrder(AVLNode<DT>* node);
  30.     AVLNode<DT>* minValueNode(AVLNode<DT>* node);
  31.     AVLNode<DT>* maxValueNode(AVLNode<DT>* node);
  32. public:
  33.     AVLNode<DT>* insert(DT datum);
  34.     AVLNode<DT>* remove(DT datum);
  35.     void display();
  36.     void inOrder();
  37.     void preOrder();
  38.     void postOrder();
  39.     AVLTree();
  40. };
  41.  
  42. template<typename DT>
  43. int AVLTree<DT>::height(AVLNode<DT>* node) {
  44.     int h = 0;
  45.     if (node != NULL) {
  46.         int lHeight = height(node->left);
  47.         int rHeight = height(node->right);
  48.         if (lHeight >= rHeight) h = lHeight + 1;
  49.         else h = rHeight + 1;
  50.     }
  51.     return h;
  52. }
  53.  
  54. template<typename DT>
  55. int AVLTree<DT>::diff(AVLNode<DT>* node) {
  56.     int lHeight = height(node->left);
  57.     int rHeight = height(node->right);
  58.     int bFactor = lHeight - rHeight;
  59.     return bFactor;
  60. }
  61.  
  62. template<typename DT>
  63. AVLNode<DT>* AVLTree<DT>::rrRotation(AVLNode<DT>* parent) {
  64.     AVLNode<DT>* temp;
  65.     temp = parent->right;
  66.     parent->right = temp->left;
  67.     temp->left = parent;
  68.     return temp;
  69. }
  70.  
  71. template<typename DT>
  72. AVLNode<DT>* AVLTree<DT>::llRotation(AVLNode<DT>* parent) {
  73.     AVLNode<DT>* temp;
  74.     temp = parent->left;
  75.     parent->left = temp->right;
  76.     temp->right = parent;
  77.     return temp;
  78. }
  79.  
  80. template<typename DT>
  81. AVLNode<DT>* AVLTree<DT>::lrRotation(AVLNode<DT>* parent) {
  82.     AVLNode<DT>* temp;
  83.     temp = parent->left;
  84.     parent->left = rrRotation(temp);
  85.     return llRotation(parent);
  86. }
  87.  
  88. template<typename DT>
  89. AVLNode<DT>* AVLTree<DT>::rlRotation(AVLNode<DT>* parent) {
  90.     AVLNode<DT>* temp;
  91.     temp = parent->right;
  92.     parent->right = llRotation(temp);
  93.     return rrRotation(parent);
  94. }
  95.  
  96. template<typename DT>
  97. AVLNode<DT>* AVLTree<DT>::balance(AVLNode<DT>* node) {
  98.     int balFactor = diff(node);
  99.     if (balFactor > 1) {
  100.         if (diff(node->left) > 0) node = llRotation(node);
  101.         else node = lrRotation(node);
  102.     }
  103.     else if (balFactor < -1) {
  104.         if (diff(node->right) > 0) node = rlRotation(node);
  105.         else node = rrRotation(node);
  106.     }
  107.     return node;
  108. }
  109.  
  110. template<typename DT>
  111. AVLNode<DT>* AVLTree<DT>::remove(DT datum, AVLNode<DT>* node) {
  112.     if (root == NULL) return root;
  113.     if (datum < node->datum) node->left = remove(datum, node->left);
  114.     else if (datum > node->datum) node->right = remove(datum, node->right);
  115.     else {
  116.         if (node->left == NULL || root->right == NULL) {
  117.             AVLNode<DT>* temp = node->left ? node->left : node->right;
  118.             if (temp == NULL) {
  119.                 temp = node;
  120.                 node = NULL;
  121.             }
  122.             else *node = *temp;
  123.             delete(temp);
  124.         }
  125.         else {
  126.             if (minValueNode(node->right) != NULL) {
  127.                 AVLNode<DT>* temp = minValueNode(node->right);
  128.                 node->datum = temp->datum;
  129.                 node->right = remove(temp->datum, node->right);
  130.             }
  131.             else {
  132.                 AVLNode<DT>* temp = maxValueNode(node->left);
  133.                 node->datum = temp->datum;
  134.                 node->left = remove(temp->datum, node->left);
  135.             }
  136.            
  137.            
  138.         }
  139.     }
  140.  
  141.     if (node == NULL) return NULL;
  142.  
  143.     node = balance(node);
  144.     return node;
  145. }
  146.  
  147. template<typename DT>
  148. AVLNode<DT>* AVLTree<DT>::insert(AVLNode<DT>* node, DT datum) {
  149.     if (node == NULL) {
  150.         node = new AVLNode<DT>;
  151.         node->datum = datum;
  152.         node->left = NULL;
  153.         node->right = NULL;
  154.         return node;
  155.     }
  156.     else if (datum < node->datum) {
  157.         node->left = insert(node->left, datum);
  158.         node = balance(node);
  159.     }
  160.     else if (datum >= node->datum)
  161.     {
  162.         node->right = insert(node->right, datum);
  163.         node = balance(node);
  164.     }
  165.     return node;
  166. }
  167.  
  168. template<typename DT>
  169. AVLNode<DT>* AVLTree<DT>::insert(DT datum) {
  170.     if (root == NULL) {
  171.         root = new AVLNode<DT>;
  172.         root->datum = datum;
  173.         root->left = NULL;
  174.         root->right = NULL;
  175.         return root;
  176.     }
  177.     else return root = insert(root, datum);
  178. }
  179.  
  180. template<typename DT>
  181. AVLNode<DT>* AVLTree<DT>::remove(DT datum) {
  182.     return root = remove(datum, root);
  183. }
  184.  
  185. template<typename DT>
  186. void AVLTree<DT>::display() {
  187.     display(root, 1);
  188. }
  189.  
  190. template<typename DT>
  191. void AVLTree<DT>::inOrder() {
  192.     cout << "Inorder: [";
  193.     inOrder(root);
  194.     cout << "]" << endl;
  195. }
  196.  
  197. template<typename DT>
  198. void AVLTree<DT>::preOrder() {
  199.     cout << "Preorder: [";
  200.     preOrder(root);
  201.     cout << "]" << endl;
  202. }
  203.  
  204. template<typename DT>
  205. void AVLTree<DT>::postOrder() {
  206.     cout << "Postorder: [";
  207.     postOrder(root);
  208.     cout << "]" << endl;
  209. }
  210.  
  211. template<typename DT>
  212. void AVLTree<DT>::display(AVLNode<DT>* node, int level) {
  213.     if (node != NULL) {
  214.         display(node->right, level + 1);
  215.         cout << endl;
  216.         if (node == root) cout << "Root -> ";
  217.         for(int i = 0; i < level && node != root; i++) cout << "        ";
  218.         cout << node->datum;
  219.         display(node->left, level + 1);
  220.     }
  221. }
  222.  
  223. template<typename DT>
  224. void AVLTree<DT>::inOrder(AVLNode<DT>* node) {
  225.     if (node == NULL) return;
  226.     inOrder(node->left);
  227.     cout << node->datum << ", ";
  228.     inOrder(node->right);
  229. }
  230.  
  231. template<typename DT>
  232. void AVLTree<DT>::preOrder(AVLNode<DT>* node) {
  233.     if (node == NULL) return;
  234.     cout << node->datum << ", ";
  235.     preOrder(node->left);
  236.     preOrder(node->right);
  237. }
  238.  
  239. template<typename DT>
  240. void AVLTree<DT>::postOrder(AVLNode<DT>* node) {
  241.     if (node == NULL)
  242.         return;
  243.     postOrder(node->left);
  244.     postOrder(node->right);
  245.     cout << node->datum << ", ";
  246. }
  247.  
  248. template<typename DT>
  249. AVLNode<DT>* AVLTree<DT>::minValueNode(AVLNode<DT>* node) {
  250.     if (node == NULL) return NULL;
  251.     AVLNode<DT>* current = node;
  252.     while (current->left != NULL) current = current->left;
  253.     return current;
  254. }
  255.  
  256. template<typename DT>
  257. AVLNode<DT>* AVLTree<DT>::maxValueNode(AVLNode<DT>* node) {
  258.     if (node == NULL) return NULL;
  259.     AVLNode<DT>* current = node;
  260.     while (current->right != NULL) current = current->right;
  261.     return current;
  262. }
  263.  
  264. template<typename DT>
  265. AVLTree<DT>::AVLTree() {
  266.     root = NULL;
  267. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement