Advertisement
sp1d3o

BST v.1

Jan 11th, 2022
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.13 KB | None | 0 0
  1. /**
  2.  * @Author Thomas "Thomassino" Vitulovič && Květoslav Cimbálovič
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. //přidání, za/před konkrétní prvek, smazání prvku před/za, modifikace dat, vyvážení stromu
  8.  
  9. typedef struct t_Node {
  10.     char key;
  11.     int value;
  12.     struct t_Node *left;
  13.     struct t_Node *right;
  14. } t_Node_t;
  15.  
  16. void insert_key(t_Node_t **node, int given_value, char key);
  17. void inord_trav(t_Node_t *root);
  18. void preord_trav(t_Node_t *root);
  19. void postord_trav(t_Node_t *root);
  20. void del_before(t_Node_t *root, int mark);
  21. t_Node_t *newNode(int item);
  22. t_Node_t *find_MinValue(t_Node_t *node);
  23. void del_node(t_Node_t *root, int marker);
  24. t_Node_t *search_tree(t_Node_t **root, char mark);
  25.  
  26.  
  27.  
  28. t_Node_t *newNode(int item)         //creating new node
  29. {
  30.     t_Node_t *tmp = (t_Node_t *)malloc(sizeof(t_Node_t));
  31.     if(tmp != NULL) {
  32.         tmp->value = item;
  33.         tmp->left = tmp->right = NULL;
  34.         tmp->key = "a";
  35.     }
  36.     return tmp;
  37. }
  38.  
  39. void inord_trav(t_Node_t *root)     //inorder traversal w/recursion
  40. {
  41.     if(root != NULL) {
  42.         inord_trav(root->left);
  43.         printf("%d\n", root->value);
  44.         inord_trav(root->right);
  45.     }
  46. }
  47.  
  48. void preord_trav(t_Node_t *root)
  49. {
  50.     if(root != NULL) {
  51.         printf("%d\n", root->value);
  52.         preord_trav(root->left);
  53.         preord_trav(root->right);
  54.     }
  55. }
  56.  
  57. void postord_trav(t_Node_t *root)
  58. {
  59.     if(root != NULL) {
  60.         postord_trav(root->left);
  61.         postord_trav(root->right);
  62.         printf("%d\n", root->value);
  63.     }
  64. }
  65.  
  66. t_Node_t *search_tree(t_Node_t **root, char mark)
  67. {
  68.     if(*root == NULL) {
  69.         return *root;
  70.     }
  71.  
  72.     t_Node_t *tmp = *root;
  73.  
  74.     if(mark < tmp->key) {
  75.         return search_tree(&tmp->left, mark);
  76.     }
  77.  
  78.     if(mark > tmp->key) {
  79.         return search_tree(&tmp->right, mark);
  80.     }
  81.  
  82.     if(mark == tmp->key) {
  83.         return tmp;
  84.     }
  85. }
  86.  
  87. void del_before(t_Node_t *root, int mark)
  88. {
  89.  
  90. }
  91.  
  92. void insert_key(t_Node_t **node, int given_value, char key)      //inserting node with given data value
  93. {
  94.     if(*node == NULL) {
  95.         *node = newNode(given_value);
  96.         return;
  97.     }
  98.  
  99.     t_Node_t *tmp = *node;
  100.  
  101.     if(key < tmp->key) {
  102.         insert_key(&tmp->left, given_value,key);
  103.     }
  104.     else if(key > tmp->key) {
  105.         insert_key(&tmp->right, given_value,key);
  106.     }
  107. }
  108.  
  109. t_Node_t *find_MinValue(t_Node_t *node)     //finding node with minimal value => topmost left leaf of the tree
  110. {
  111.     t_Node_t *current = node;
  112.  
  113.     while(current && current->left != NULL) {
  114.         current = current->left;
  115.     }
  116.  
  117.     return current;
  118. }
  119.  
  120. void del_node(t_Node_t *root, int marker)
  121. {
  122.     if(root == NULL) {
  123.         return;
  124.     }
  125.  
  126.     if(marker < root->value) {
  127.         del_node(root->left, marker);
  128.     }
  129.  
  130.     else if(marker > root->value) {
  131.         del_node(root->right, marker);
  132.     }
  133.  
  134.     else {
  135.         if(root->left == NULL) {
  136.             t_Node_t *tmp = root->right;
  137.             free(root);
  138.             root = NULL;
  139.             return;
  140.         }
  141.  
  142.         else if(root->right == NULL) {
  143.             t_Node_t *tmp = root->left;
  144.             free(root);
  145.             root = NULL;
  146.             return;
  147.         }
  148.  
  149.         t_Node_t *tmp = find_MinValue(root->right);
  150.  
  151.         root->value = tmp->value;
  152.  
  153.         del_node(root->right, tmp->value);
  154.     }
  155.  
  156.     return;
  157. }
  158.  
  159. int main()
  160. {
  161.     t_Node_t *root = NULL;
  162.  
  163.     //creating root
  164.     insert_key(&root, 50,'h');
  165.  
  166.     //creating childs
  167.     insert_key(&root, 30,'b' );
  168.     insert_key(&root, 20, 'a');
  169.     insert_key(&root, 40, 'c');
  170.     insert_key(&root, 70,'j');
  171.     insert_key(&root, 60,'i');
  172.     insert_key(&root, 80,'k');
  173.  
  174.     //print in inorder traversal
  175.     printf("Inorder traversal of the given tree\n\n");
  176.     inord_trav(root);
  177.  
  178.     /*//deleting 20
  179.     printf("\nDelete 20\n");
  180.     del_node(root, 20);
  181.     printf("\nPrinting modified tree\n\n");
  182.     inord_trav(root);
  183.  
  184.     //deleting 30
  185.     printf("\nDelete 30\n");
  186.     del_node(root, 30);
  187.     printf("\nPrinting modified tree\n\n");
  188.     inord_trav(root);
  189.  
  190. */    //printf("%p\n", search_tree(root, 40));
  191.     return 0;
  192. }
  193.  
  194.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement