Advertisement
Guest User

Untitled

a guest
May 2nd, 2020
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.86 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int big_deep;
  5.  
  6. typedef struct Tree
  7. {
  8. int key;
  9. int length_sons;
  10. struct Tree* parent;
  11. struct Tree* *sons;
  12. }node;
  13.  
  14. void create_tree(node **tree, int key)
  15. {
  16. node *tmp_tree = malloc(sizeof(node));
  17. tmp_tree->key = key;
  18. tmp_tree->length_sons = 0;
  19. tmp_tree->parent = NULL;
  20. tmp_tree->sons = NULL;
  21. *tree = tmp_tree;
  22. }
  23.  
  24. node* find_leaf(node **tree, int leaf) {
  25. node *work_tree = *tree;
  26.  
  27. if(work_tree == NULL) return NULL;
  28.  
  29. if(work_tree->key == leaf) return work_tree;
  30.  
  31. node *where = NULL;
  32. if(work_tree->sons) {
  33. int length = work_tree->length_sons;
  34. for(int i=0; i<length; i++) {
  35. where = find_leaf(&work_tree->sons[i], leaf);
  36. if( (where) && (where->key == leaf) ) return where;
  37. }
  38. }
  39. return work_tree;
  40. }
  41.  
  42. void add_node(node **tree, int key, int father)
  43. {
  44. node *work_tree = find_leaf(tree, father);
  45. node *tmp_node = malloc(sizeof(node));
  46. tmp_node->key = key;
  47. tmp_node->length_sons = 0;
  48. tmp_node->parent = work_tree;
  49. tmp_node->sons = NULL;
  50. if(work_tree->sons){
  51. int length = work_tree->length_sons;
  52. work_tree->sons[length] = tmp_node;
  53. work_tree->length_sons+=1;
  54. }
  55. else {
  56. work_tree->sons = malloc(sizeof(node));
  57. work_tree->sons[0] = tmp_node;
  58. work_tree->length_sons+=1;
  59. }
  60. }
  61.  
  62. void delete_node(node **tree, int key)
  63. {
  64. node *work_tree = find_leaf(tree, key);
  65. if(work_tree->length_sons > 0) {
  66. int length = work_tree->length_sons;
  67. for(int i = (length-1); i>=0 ; i-- ) delete_node(&work_tree->sons[i], work_tree->sons[i]->key);
  68. length--;
  69. }
  70. node *parent_tree = work_tree->parent;
  71. if(parent_tree != NULL) {
  72. int length = parent_tree->length_sons;
  73. int position = -1;
  74. for(int i=0; i<length; i++) {
  75. if(parent_tree->sons[i]->key == key) position = i;
  76. }
  77. if(position < (length-1) ) {
  78. for(int i = (position+1) ; i < length ; i++ ){
  79. parent_tree->sons[i-1] = parent_tree->sons[i];
  80. }
  81. }
  82. parent_tree->sons[length-1] = NULL;
  83. parent_tree->length_sons = length-1;
  84. }
  85. free(work_tree);
  86. work_tree = NULL;
  87. }
  88.  
  89. void print_tree(node *tree, int space)
  90. {
  91. if(tree != NULL) {
  92. for(int i=0;i<space;i++) printf(" ");
  93. printf("%d\n", tree->key);
  94. if(tree->sons != NULL) {
  95. int length = tree->length_sons;
  96. for(int i=0;i<length;i++) {
  97. print_tree(tree->sons[i], (space+1));
  98. }
  99. }
  100. }
  101. }
  102.  
  103. void find_deep(node *tree, int current_deep)
  104. {
  105. if(tree != NULL) {
  106. if(current_deep > big_deep) big_deep = current_deep;
  107. if(tree->sons != NULL) {
  108. int length = tree->length_sons;
  109. for(int i=0;i<length;i++) {
  110. find_deep(tree->sons[i], (current_deep+1));
  111. }
  112. }
  113. }
  114. }
  115.  
  116. void print_menu()
  117. {
  118. printf("_^_^_^_^_^_^_\n");
  119. printf("Menu:\n1. Add node;\n2. Print tree;\n3. Delete node;\n4. Deep tree.\nChoose one action: \n");
  120. }
  121.  
  122. int main(void) {
  123. node* tree = NULL;
  124.  
  125. int inp, key, key_start, father;
  126. print_menu();
  127. while(scanf("%d", &inp)!=EOF) {
  128. switch(inp) {
  129. case 1:
  130. printf("Input node: ");
  131. scanf("%d", &key);
  132. if(tree == NULL) {
  133. key_start = key;
  134. create_tree(&tree, key);
  135. }
  136. else {
  137. printf("\nInput father: ");
  138. scanf("%d", &father);
  139. add_node(&tree, key, father);
  140. }
  141. break;
  142. case 2:
  143. if(tree == NULL) printf("\nTree is empty.\n");
  144. else {
  145. printf("_\n");
  146. print_tree(tree, 0);
  147. printf("_\n");
  148. }
  149. break;
  150. case 3:
  151. if(tree == NULL) printf("\nNo tree, no delete.\n");
  152. else {
  153. printf("Input node: ");
  154. scanf("%d", &key);
  155. delete_node(&tree, key);
  156. if(key == key_start) tree = NULL;
  157. }
  158. break;
  159. case 4:
  160. if(tree == NULL) printf("\nNo tree, no deep.\n");
  161. else {
  162. big_deep = 0;
  163. find_deep(tree, big_deep);
  164. printf("Tree deep is %d\n", big_deep);
  165. }
  166. break;
  167. }
  168. print_menu();
  169. }
  170.  
  171. return 0;
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement