Advertisement
madegoff

5_1

Jan 12th, 2024
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.20 KB | None | 0 0
  1. /*
  2. Zur Abgabe einen branch `iprg-b05` erstellen und pushen, in dem als einzige Datei die `05ex.c` liegt.
  3. */
  4.  
  5. /*
  6. Um die Tests für dieses Blatt zu kompilieren und zu starten, führen Sie den folgenden Befehl aus:
  7. cc -std=c11 -g -Wall -Werror 05ex_test.c -o 05ex_test.o -lm && ./05ex_test.o
  8.  
  9. Wir empfehlen, mit möglichst streng eingestelltem valgrind zu testen, denn so testen wir auch auf dem Server:
  10. cc -std=c11 -g -Wall -Werror 05ex_test.c -o 05ex_test.o -lm && valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./05ex_test.o
  11. */
  12.  
  13. #include "search_tree.h"
  14. #include <stdio.h>
  15. #include <stdbool.h>
  16. #include <stdlib.h>
  17.  
  18. /*
  19. Aufgabe 1:
  20.  
  21. Fügen Sie den Wert `x` als Blatt so in den nicht-leeren Suchbaum `t` ein, dass `t` hinterher
  22. wieder ein Suchbaum ist. Falls `x` bereits in `t` vorkam, soll `t` stattdessen
  23. unverändert bleiben.
  24. Geben Sie zurück, ob der Baum modifiziert wurde.
  25.  
  26. Nutzen Sie `malloc`, um das neue Blatt zu erstellen. Der Testrunner wird das Blatt wieder `free`n,
  27. darum brauchen Sie sich nicht zu kümmern.
  28. */
  29. bool search_tree_insert(TreeNode *t, uint16_t x) {
  30.  
  31. if(t==NULL) return false;
  32.  
  33. TreeNode *current = NULL;
  34. TreeNode *next = t;
  35. TreeNode *new_elem = (TreeNode *)malloc(sizeof(TreeNode));
  36.  
  37. new_elem->item = x;
  38. new_elem->left = NULL;
  39. new_elem->right = NULL;
  40.  
  41. while (next){
  42. current = next;
  43. if(next->item < x){ //suchen den linken teilbaum ab
  44. next = next->left;
  45. }
  46. else if(next->item > x){ //suchen den rechten teilbaum ab
  47. next = next->right;
  48. }
  49. else{ // item = x also element schon im baum vorhanden
  50. return false; //nicht eingefuegt also nicht geaendert
  51. }
  52. } // haben den platz fuer x gefunden
  53.  
  54. if(x <= current->item){
  55. current->left = new_elem;
  56. }
  57. else{
  58. current->right = new_elem;
  59. }
  60. //free(new_elem);
  61. return true;
  62. }
  63.  
  64. /*
  65. Aufgabe 2:
  66. Geben Sie die kleinste Zahl im Suchbaum `t` zurück, welche echt größer als `x` ist.
  67. Falls keine solche Zahl existiert, geben Sie stattdessen `x` zurück. Die Laufzeit Ihrer Lösung soll
  68. proportional zur Höhe des Baumes sein, aber unabhängig von der Gesamtzahl an Knoten.
  69. */
  70. /*uint16_t find_min(TreeNode *t){
  71.  
  72. TreeNode *leaf = t;
  73. if(leaf->left){ //es gibt ein kleineren elem
  74. //find_min(leaf->left);
  75. }
  76. else if(leaf->right){
  77. find_min(leaf->right);
  78.  
  79. return leaf->item;
  80. }
  81. */
  82.  
  83. uint16_t search_tree_get_greater_than(TreeNode *t, uint16_t x) {
  84.  
  85. TreeNode *leaf = t;
  86. int res;
  87. //int min_item = find_min(t);
  88. //if(min_item > x) return min_item;
  89.  
  90. while(leaf){ //baum durchsuchen
  91. if(leaf->item <= x){ //schauen im rechten teilbaum, weil wir eine groessere zahl suchen
  92. leaf = leaf->right;
  93. }
  94. else{ //item groesser als x, koennte entweder unsere antwort sein oder es gibt eine kleinere zahl
  95. leaf = leaf->left;
  96. res = leaf->item;
  97. }
  98. }
  99.  
  100. if (res) return res; // wenn res gefunden (ohne dass NULL zeiger am ende des baums erreicht wurde), ist sein item unsere gesuchte zahl
  101. else return x; // nichts gefunden, x zurueckgeben
  102.  
  103. }
  104.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement