Advertisement
Rana_093

BinarySearchTree(BasicImplementation)

Apr 2nd, 2017
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.27 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. struct treeNode {
  6.     int item;
  7.     struct treeNode *left;
  8.     struct treeNode *right;
  9. };
  10.  
  11. struct treeNode *root;
  12.  
  13.  
  14. void initializeTree()
  15. {
  16.     root = 0;
  17. }
  18.  
  19.  
  20. struct treeNode *makeTreeNode(int item)
  21. {
  22.     struct treeNode *node;
  23.     node = (struct treeNode *)malloc(sizeof(struct treeNode));
  24.     node -> item = item;
  25.     node -> right =0 ;
  26.     node -> left = 0;
  27.     return node;
  28. };
  29.  
  30.  
  31. struct treeNode *insertItem(struct treeNode *node, int item)
  32. {
  33.     if(node== 0)
  34.     {
  35.         struct treeNode *newNode = makeTreeNode(item);
  36.         root = newNode;
  37.         return newNode;
  38.     }
  39.     if(node -> item == item)
  40.     {
  41.         return 0;
  42.     }
  43.     if(item < node -> item && node -> left ==0)
  44.     {
  45.         struct treeNode * newNode = makeTreeNode(item);
  46.         node->left = newNode;
  47.         return newNode;
  48.     }
  49.     if(item > node->item && node -> right ==0)
  50.     {
  51.         struct treeNode *newNode = makeTreeNode(item);
  52.         node -> right = newNode;
  53.         return newNode;
  54.     }
  55.     if(item < node ->item)
  56.     {
  57.         return insertItem(node -> left,item);
  58.     }
  59.     else {
  60.         return insertItem(node -> right,item);
  61.     }
  62. };
  63.  
  64.  
  65. struct treeNode *searchItem(struct treeNode *node, int item)
  66. {
  67.     if(node ==0)
  68.     {
  69.         return 0;
  70.     }
  71.     if(node -> item == item){
  72.         return node;
  73.     }
  74.     struct treeNode *t = 0;
  75.     if(item < node -> item)
  76.     {
  77.         t = searchItem(node -> left,item);
  78.     }
  79.     else
  80.     {
  81.         t = searchItem(node -> right, item);
  82.     }
  83. };
  84.  
  85.  
  86. int calcNodeHeight(struct treeNode *node) ///height of root/full tree
  87. {
  88.     if(node == 0){
  89.         return -1;
  90.     }
  91.     int l , r;
  92.     l = calcNodeHeight(node -> left);
  93.     r = calcNodeHeight(node -> right);
  94.     if(l>r) return l+1;
  95.     else return r+1;
  96. }
  97.  
  98.  
  99. int calcHeight(int item){ ///height of a node
  100.     struct treeNode *node = 0;
  101.     node = searchItem(node,item);
  102.     if(node == 0){
  103.         return -1;
  104.     }
  105.     else return calcNodeHeight(node);
  106. }
  107.  
  108.  
  109.  
  110. int calcDepth(int item)//return depth of an item in the tree
  111. {
  112.     struct treeNode *node;
  113.     node = root;
  114.     if(root == 0)
  115.     {
  116.         printf("Insert Something\n");
  117.         return -1;
  118.     }
  119.  
  120.     struct treeNode *res = searchItem(root,item);
  121.     if(res == 0){
  122.         printf("Not Found\n");
  123.         return -1;
  124.     }
  125.  
  126.  
  127.     bool flag ;
  128.     int cnt = 0;
  129.     while(true)
  130.     {
  131.  
  132.         if(node -> item == item)
  133.         {
  134.            /// flag = true;
  135.             break;
  136.         }
  137.         if(node->item>item)
  138.         {
  139.             node = node ->left;
  140.             cnt++;
  141.         }
  142.         else
  143.         {
  144.             node = node -> right;
  145.             cnt++;
  146.         }
  147.     }
  148.         return cnt;
  149. }
  150.  
  151.  
  152. int rangeSearch(struct treeNode *node, int leftbound,int rightbound)
  153. {
  154.     if(root == 0){
  155.     printf("Insert Something\n");
  156.     return -9999;
  157.     }
  158.  
  159.     if(leftbound == rightbound){
  160.         return 1;
  161.     }
  162.  
  163.     if(node == 0){
  164.         return 0;
  165.     }
  166.  
  167.     if(node -> item == leftbound && node -> item == rightbound){
  168.     return 1;
  169.     }
  170.  
  171.     if(node->item >= leftbound &&  node->item <=rightbound){
  172.         return 1+rangeSearch(node->left,leftbound,rightbound)+rangeSearch(node->right,leftbound,rightbound);
  173.     }
  174.  
  175.     if(node ->item < rightbound){
  176.         return rangeSearch(node ->left,leftbound,rightbound);
  177.     }
  178.  
  179.     else {
  180.         return rangeSearch(node->right,leftbound,rightbound);
  181.     }
  182.  
  183. }
  184.  
  185. /**struct treeNode *GetMinNode(struct treeNode *node){
  186.     if(node == 0){
  187.         return 0;
  188.     }
  189.  
  190.     else {
  191.         return
  192.     }
  193.  
  194.  
  195.     /**while(node->left!=0){
  196.         node = node ->left;
  197.     }*/
  198.     /*return node;
  199. };*/
  200.  
  201.  
  202.  
  203. int deleteItem(struct treeNode *node, int item){
  204.  
  205.     int n;
  206.     struct treeNode *temp = searchItem(root,item);
  207.     if(temp == 0){
  208.         printf("Not Found\n");
  209.         return -9999;
  210.     }
  211.     struct treeNode *cur = node;
  212.     struct treeNode *prev=cur;
  213.     if(cur == 0){
  214.         ///printf("Insert Something\n");
  215.         return 0;
  216.     }
  217.  
  218.     while(true){
  219.         ///if(node)
  220.  
  221.         if(cur-> item == item)
  222.         {
  223.            /// flag = true;
  224.             break;
  225.         }
  226.         if(cur->item >item)
  227.         {
  228.             prev = cur;
  229.             cur= cur ->left;
  230.            /// cnt++;
  231.         }
  232.         else
  233.         {
  234.             prev = cur;
  235.             cur = cur -> right;
  236.            /// cnt++;
  237.         }
  238.     }
  239.     bool flag = false;
  240.     if (cur == root){
  241.         flag = true;
  242.     }
  243.  
  244.     if(cur-> left == 0 && cur->right==0 ){
  245.  
  246.         if(flag){
  247.             ///root = 0;
  248.             free(cur);
  249.             root = 0;
  250.             return 1;
  251.         }
  252.  
  253.  
  254.         if(prev -> right == cur){
  255.  
  256.            /// cout<<"prev -> right == cur"<<endl;
  257.             prev -> right = 0;
  258.         }
  259.         else {
  260.             ///cout<<"prev -> left"<<endl;
  261.             prev -> left = 0;
  262.         }
  263.         free(cur);
  264.         ///cur = 0;
  265.         return 1;
  266.     }
  267.  
  268.  
  269.     else if(cur -> left == 0){
  270.         ///struct treeNode *t;
  271.         ///t = cur->right;
  272.        /// t->left = res->left;
  273.        if(flag){
  274.         root = cur -> right;
  275.         free(cur);
  276.         return 1;
  277.        }
  278.  
  279.  
  280.        if(prev -> left == cur){
  281.         prev -> left = cur -> left;
  282.        }
  283.        else
  284.        {
  285.            prev -> right = cur -> right;
  286.        }
  287.        free(cur);
  288.  
  289.  
  290.         ///free(cur);
  291.         return 1;
  292.     }
  293.     if(cur -> right ==0){
  294.         if(flag){
  295.             root = cur -> left;
  296.             free(cur);
  297.             return 1;
  298.         }
  299.  
  300.  
  301.         if(prev -> right == cur){
  302.             prev -> right = cur -> left;
  303.         }
  304.         else {
  305.             prev -> left = cur -> left;
  306.         }
  307.         free(cur);
  308.         return 1;
  309.     }
  310.     else
  311.     {
  312.         struct treeNode *t,*t1;
  313.         t = cur->right;
  314.         while(t->left!=0){
  315.  
  316.             t = t->left;
  317.         }
  318.  
  319.        /// temp = GetMinNode(cur ->right);
  320.         if(flag)
  321.         {
  322.             /*struct treeNode *n;
  323.             n= t;*/
  324.            /// root = t;
  325.            //cout<<"t -> item "<<t->item<<endl;
  326.             cur -> item = t->item;
  327.             ///root = cur;
  328.             ///if(prev == t)
  329.             prev->right = prev ->right ->right;
  330.  
  331.             //else
  332.             //prev->left = t->right;
  333.             ///cur -> right = prev->right;
  334.             free(t);
  335.  
  336.             //cout<<"root item -> "<<root -> item<<endl;
  337.            // delete t;
  338.            /// free(n);
  339.             return 1;
  340.         }
  341.         if(prev -> right == cur){
  342.             prev -> right = t;
  343.         }
  344.         else {
  345.             prev -> left = t;
  346.         }
  347.         free(cur);
  348.         return 1;
  349.     }
  350.  
  351. }
  352.  
  353.  
  354.  
  355. void printInOrder(struct treeNode * node, int height)
  356. {
  357.     if(node==0) return  ;
  358.  
  359.     //print left sub-tree
  360.     printInOrder(node->left, height-1);
  361.  
  362.     //print item
  363.     for(int i=0;i<height;i++)printf("   ");
  364.     printf("%03d\n",node->item);
  365.  
  366.     //print right sub-tree
  367.     printInOrder(node->right, height-1);
  368. }
  369.  
  370.  
  371. int getSize(struct treeNode *node)
  372. {
  373.     if(node == 0)
  374.     {
  375.         return 0;
  376.     }
  377.     return 1+getSize(node -> left)+getSize(node->right);
  378. }
  379.  
  380. int getMinItem()
  381. {
  382.     struct treeNode *node;
  383.     node = (struct treeNode *)malloc(sizeof(treeNode));
  384.     node = root;
  385.     if(root==0) return -99999;
  386.     else
  387.     {
  388.         while(node->left!=0){
  389.             node = node->left;
  390.         }
  391.     }
  392.     int value = node->item;
  393.     return value;
  394. }
  395.  
  396.  
  397. int getMaxItem()
  398. {
  399.     struct treeNode *node;
  400.     node = (struct treeNode *)malloc(sizeof(treeNode));
  401.     node = root;
  402.     if(root==0) return -99999;
  403.     else
  404.     {
  405.         while(node->right!=0){
  406.             node = node->right;
  407.         }
  408.     }
  409.     int value = node->item;
  410.     return value;
  411. }
  412.  
  413.  
  414.  
  415. int calcNodeDepth(struct treeNode *node)
  416. {
  417.     int item = node -> item;
  418.     return calcDepth(item);
  419. }
  420.  
  421.  
  422.  
  423. int main()
  424. {
  425.     ios_base::sync_with_stdio(false);
  426.     initializeTree();
  427.     while(1)
  428.     {
  429.         printf("1. Insert item. 2. Delete item. 3. Search item. \n");
  430.         printf("4. Print height of tree. 5. Print height of an item. \n");
  431.         printf("6. PrintInOrder. 7. exit. 8.GetSize Of the tree \n");
  432.         printf("9. GetMinValue. 10. GetMaxValue. 11. Calc Depth Of an Item\n");
  433.         printf("12. Range Search \n");
  434.  
  435.         int ch;
  436.         scanf("%d",&ch);
  437.         if(ch==1)
  438.         {
  439.             int item;
  440.             scanf("%d", &item);
  441.             insertItem(root, item);
  442.         }
  443.         else if(ch==2)
  444.         {
  445.             int item;
  446.             scanf("%d", &item);
  447.             deleteItem(root, item);
  448.         }
  449.         else if(ch==3)
  450.         {
  451.             int item;
  452.             scanf("%d", &item);
  453.             struct treeNode * res = searchItem(root, item);
  454.             if(res!=0) printf("Found.\n");
  455.             else printf("Not found.\n");
  456.         }
  457.         else if(ch==4)
  458.         {
  459.             int height = calcNodeHeight(root);
  460.             printf("Height of tree = %d\n", height);
  461.         }
  462.         else if(ch==5)
  463.         {
  464.             int item;
  465.             scanf("%d", &item);
  466.             int height = calcHeight(item);
  467.             printf("Height of %d = %d\n", item, height);
  468.         }
  469.         else if(ch==6)
  470.         {
  471.             int h = calcNodeHeight(root);
  472.             printf("\n--------------------------------\n");
  473.             printInOrder(root, h);
  474.             printf("--------------------------------\n");
  475.         }
  476.         else if(ch==7)
  477.         {
  478.             break;
  479.         }
  480.         else if(ch==8){
  481.             int n = getSize(root);
  482.             printf("Size -> %d\n",n);
  483.         }
  484.         else if(ch==9){
  485.             int n = getMinItem();
  486.             printf("Min Item -> %d\n",n);
  487.         }
  488.         else if(ch==10){
  489.             int n = getMaxItem();
  490.             printf("Max item -> %d\n",n);
  491.         }
  492.         else if(ch==11){
  493.                 int item;
  494.                 scanf("%d",&item);
  495.             int n = calcDepth(item);
  496.             printf("Depth -> %d\n",n);
  497.         }
  498.         else if(ch==12){
  499.             int low,high;
  500.             scanf("%d %d",&low,&high);
  501.             int n = rangeSearch(root,low,high);
  502.             printf("total element within this range -> %d\n",n);
  503.         }
  504.     }
  505.     return 0;
  506. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement