rofi93

AVL Tree

Sep 22nd, 2018
1,509
0
Never
5
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.57 KB | None | 0 0
  1. /* -------------------------------- */
  2. /* Name: MD. Khairul Basar          */
  3. /* Institute: HSTU                  */
  4. /* Dept: CSE                        */
  5. /* Email: [email protected] */
  6. /* -------------------------------- */
  7.  
  8. #include <bits/stdc++.h>
  9. /* all header files */
  10.  
  11. #define fs            first
  12. #define sc            second
  13. #define sp            printf(" ")
  14. #define nl            printf("\n")
  15. #define pb(a)         push_back(a)
  16.  
  17. #define setzero(a)    memset(a,0,sizeof(a))
  18. #define setneg(a)     memset(a,-1,sizeof(a))
  19. #define setinf(a)     memset(a,126,sizeof(a))
  20.  
  21. #define tc1(x)        printf("Case %d: ",x)
  22. #define tc2(x)        printf("Case #%d: ",x)
  23. #define tc3(x)        printf("Case %d:\n",x)
  24. #define tc4(x)        printf("Case #%d:\n",x)
  25.  
  26. #define iin(x)        scanf("%d",&x)
  27. #define din(x)        scanf("%lf",&x)
  28. #define lin(x)        scanf("%lld",&x)
  29. #define clin(x)       scanf("%I64d",&x)
  30.  
  31. #define pr1(x)        cout<<x<<"\n"
  32. #define pr2(x,y)      cout<<x<<" "<<y<<"\n"
  33. #define pr3(x,y,z)    cout<<x<<" "<<y<<" "<<z<<"\n"
  34. #define pr4(w,x,y,z)  cout<<w<<" "<<x<<" "<<y<<" "<<z<<"\n"
  35. #define fast          ios::sync_with_stdio(0)
  36. #define read          freopen("input.txt","r",stdin)
  37. #define write         freopen("output.txt","w",stdout)
  38. #define prflag1(flag) printf("%s\n",(flag)?"YES":"NO")
  39. #define prflag2(flag) printf("%s\n",(flag)?"Yes":"No")
  40. #define prflag3(flag) printf("%s\n",(flag)?"yes":"no")
  41. /* macro definitions */
  42.  
  43. using namespace std;
  44.  
  45. typedef long long LL;
  46. typedef unsigned long long ULL;
  47. typedef pair<int, int>pii;
  48. typedef pair<LL, LL>pll;
  49. typedef vector<int>vi;
  50. typedef vector<LL>vll;
  51. typedef vector<pii>vpii;
  52. typedef vector<pll>vpll;
  53. /* type definitions */
  54.  
  55. LL MOD_EXPO(LL b, LL p, LL m)
  56. {
  57.     if(p==0)
  58.         return 1;
  59.     LL ret=MOD_EXPO(b,p/2,m)%m;
  60.     ret=(ret*ret)%m;
  61.     return ((p&1) ? (ret*b)%m : ret%m);
  62. }
  63. LL POWER(LL N, LL K)
  64. {
  65.     LL i,ans=1;
  66.     for(i=1; i<=K; i++)
  67.         ans*=N;
  68.     return ans;
  69. }
  70. int SET(int N, int pos)
  71. {
  72.     return (N | (1<<pos));
  73. }
  74. int RESET(int N, int pos)
  75. {
  76.     return (N & !(1<<pos));
  77. }
  78. bool CHECK(int N, int pos)
  79. {
  80.     return (N & (1<<pos));
  81. }
  82. /* necessary functions */
  83.  
  84. int dx4[]= {1,-1,0,0};
  85. int dy4[]= {0,0,1,-1};
  86. int dx6[]= {0,0,1,-1,0,0};
  87. int dy6[]= {1,-1,0,0,0,0};
  88. int dz6[]= {0,0,0,0,1,-1};
  89. int dx8[]= {1,-1,0,0,-1,1,-1,1};
  90. int dy8[]= {0,0,1,-1,1,1,-1,-1};
  91. int dkx8[]= {-1,1,-1,1,-2,-2,2,2};
  92. int dky8[]= {2,2,-2,-2,1,-1,1,-1};
  93. /* direction arrays */
  94.  
  95. int tc=1;
  96. const double eps=1e-9;
  97. const double pi=acos(-1.0);
  98. const long long int mx=1e5;
  99. const long long int mod=1e9+7;
  100. /* global declarations */
  101.  
  102. struct node
  103. {
  104.     int key;
  105.     int height;
  106.     node *left;
  107.     node *right;
  108. };
  109.  
  110. node* create_node(int key_)
  111. {
  112.     node *child = new node;
  113.  
  114.     child->key = key_;
  115.     child->height = 1;
  116.     child->left = NULL;
  117.     child->right = NULL;
  118.  
  119.     return child;
  120. }
  121.  
  122. int get_height(node *current_node)
  123. {
  124.     if(current_node == NULL)
  125.         return 0;
  126.     return current_node->height;
  127. }
  128.  
  129. int get_balance(node *current_node)
  130. {
  131.     if(current_node == NULL)
  132.         return 0;
  133.     return get_height(current_node->left) - get_height(current_node->right);
  134. }
  135.  
  136. node* left_rotate(node *x)
  137. {
  138.     node *y = x->right;
  139.     node *t2 = y->left;
  140.  
  141.     y->left = x;
  142.     x->right = t2;
  143.  
  144.     x->height = max(get_height(x->left), get_height(x->right)) + 1;
  145.     y->height = max(get_height(y->left), get_height(y->right)) + 1;
  146.  
  147.     return y;
  148. }
  149.  
  150. node* right_rotate(node *x)
  151. {
  152.     node *y = x->left;
  153.     node *t2 = y->right;
  154.  
  155.     y->right = x;
  156.     x->left = t2;
  157.  
  158.     x->height = max(get_height(x->left), get_height(x->right)) + 1;
  159.     y->height = max(get_height(y->left), get_height(y->right)) + 1;
  160.  
  161.     return y;
  162. }
  163.  
  164. node* left_left_case(node *current_node)
  165. {
  166.     return right_rotate(current_node);
  167. }
  168.  
  169. node* right_right_case(node *current_node)
  170. {
  171.     return left_rotate(current_node);
  172. }
  173.  
  174. node* left_right_case(node *current_node)
  175. {
  176.     current_node->left = left_rotate(current_node->left);
  177.     return right_rotate(current_node);
  178. }
  179.  
  180. node* right_left_case(node *current_node)
  181. {
  182.     current_node->right = right_rotate(current_node->right);
  183.     return left_rotate(current_node);
  184. }
  185.  
  186. void preorder_traverse(node *current_node)
  187. {
  188.     if(current_node == NULL)
  189.         return;
  190.  
  191.     printf("%d ",current_node->key);
  192.     preorder_traverse(current_node->left);
  193.     preorder_traverse(current_node->right);
  194.     return;
  195. }
  196.  
  197. node* find_min(node *current_node)
  198. {
  199.     while(current_node->left != NULL)
  200.         current_node = current_node->left;
  201.     return current_node;
  202. }
  203.  
  204. node* insert_node(node *current_node, int key_)
  205. {
  206.     if(current_node == NULL)
  207.         return create_node(key_);
  208.  
  209.     if(key_ < current_node->key)
  210.         current_node->left = insert_node(current_node->left, key_);
  211.     else if(key_ > current_node->key)
  212.         current_node->right = insert_node(current_node->right, key_);
  213.     else
  214.         return current_node;
  215.  
  216.     current_node->height = max(get_height(current_node->left), get_height(current_node->right)) + 1;
  217.  
  218.     int balance = get_balance(current_node);
  219.  
  220.     if(balance > 1 && key_ < current_node->left->key)
  221.         return left_left_case(current_node);
  222.  
  223.     if(balance < -1 && key_ > current_node->right->key)
  224.         return right_right_case(current_node);
  225.  
  226.     if(balance > 1 && key_ > current_node->left->key)
  227.         return left_right_case(current_node);
  228.  
  229.     if(balance < -1 && key_ < current_node->right->key)
  230.         return right_left_case(current_node);
  231.  
  232.     return current_node;
  233. }
  234.  
  235. node* search_node(node *current_node, int item)
  236. {
  237.     while(current_node != NULL)
  238.     {
  239.         if(item > current_node->key)
  240.             current_node = current_node->right;
  241.         else if(item < current_node->key)
  242.             current_node = current_node->left;
  243.         else
  244.             break;
  245.     }
  246.     return current_node;
  247. }
  248.  
  249. node* delete_node(node *current_node, int key_)
  250. {
  251.     if(current_node == NULL)
  252.         return current_node;
  253.  
  254.     if(key_ < current_node->key)
  255.         current_node->left = delete_node(current_node->left, key_);
  256.     else if(key_ > current_node->key)
  257.         current_node->right = delete_node(current_node->right, key_);
  258.     else
  259.     {
  260.         if(current_node->left == NULL || current_node->right == NULL)
  261.         {
  262.             node *temp = NULL;
  263.  
  264.             if(current_node->left != NULL)
  265.                 temp = current_node->left;
  266.             else
  267.                 temp = current_node->right;
  268.  
  269.             if(temp == NULL)
  270.             {
  271.                 temp = current_node;
  272.                 current_node = NULL;
  273.             }
  274.             else
  275.             {
  276.                 current_node->key = temp->key;
  277.                 current_node->left = temp->left;
  278.                 current_node->right = temp->right;
  279.                 current_node->height = temp->height;
  280.             }
  281.  
  282.             delete temp;
  283.         }
  284.         else
  285.         {
  286.             node *temp = find_min(current_node->right);
  287.  
  288.             current_node->key = temp->key;
  289.             current_node->right = delete_node(current_node->right, temp->key);
  290.         }
  291.     }
  292.  
  293.     if(current_node == NULL)
  294.         return current_node;
  295.  
  296.     current_node->height = max(get_height(current_node->left), get_height(current_node->right)) + 1;
  297.  
  298.     int balance = get_balance(current_node);
  299.  
  300.     if(balance > 1 && get_balance(current_node->left) >= 0)
  301.         return left_left_case(current_node);
  302.  
  303.     if(balance < -1 && get_balance(current_node->right) <= 0)
  304.         return right_right_case(current_node);
  305.  
  306.     if(balance > 1 && get_balance(current_node->left) < 0)
  307.         return left_right_case(current_node);
  308.  
  309.     if(balance < -1 && get_balance(current_node->right) > 0)
  310.         return right_left_case(current_node);
  311.  
  312.     return current_node;
  313. }
  314.  
  315. void delete_tree(node *current_node)
  316. {
  317.     if(current_node == NULL)
  318.     {
  319.         delete current_node;
  320.         return;
  321.     }
  322.     delete_tree(current_node->left);
  323.     delete_tree(current_node->right);
  324.     return;
  325. }
  326.  
  327. int main()
  328. {
  329.     node *root = NULL;
  330.  
  331.     root = insert_node(root, 9);
  332.     root = insert_node(root, 5);
  333.     root = insert_node(root, 10);
  334.     root = insert_node(root, 0);
  335.     root = insert_node(root, 6);
  336.     root = insert_node(root, 11);
  337.     root = insert_node(root, -1);
  338.     root = insert_node(root, 1);
  339.     root = insert_node(root, 2);
  340.  
  341.     printf("Pre-order traverse: ");
  342.     preorder_traverse(root);
  343.  
  344.     root = delete_node(root, 10);
  345.  
  346.     printf("\nPre-order traverse: ");
  347.     preorder_traverse(root);
  348.     delete_tree(root);
  349.     return 0;
  350. }
Advertisement
Comments
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
Add Comment
Please, Sign In to add comment