Advertisement
madegoff

05ex

Jan 8th, 2024
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.94 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.     TreeNode *current = NULL;
  31.     TreeNode *next = t;
  32.     TreeNode *new_elem = (TreeNode *)malloc(sizeof(TreeNode));
  33.  
  34.     new_elem->item = x;
  35.     new_elem->left = NULL;
  36.     new_elem->right = NULL;
  37.  
  38.     while (next){
  39.         current = next;
  40.         if(x < next->item){ //suchen den linken teilbaum ab
  41.             next = next->left;
  42.         }
  43.         else if(x > next->item){ //suchen den rechten teilbaum ab
  44.             next = next->right;
  45.         }
  46.         else{ // item = x also element schon im baum vorhanden
  47.             return false; //nicht eingefuegt also nicht geaendert
  48.         }
  49.     } // haben den platz fuer x gefunden
  50.     if(x <= current->item){
  51.         current->left = new_elem;
  52.     }
  53.     else{
  54.         current->right = new_elem;
  55.     }
  56.     return true;
  57. }
  58.  
  59. /*
  60. Aufgabe 2:
  61. Geben Sie die kleinste Zahl im Suchbaum `t` zurück, welche echt größer als `x` ist.
  62. Falls keine solche Zahl existiert, geben Sie stattdessen `x` zurück. Die Laufzeit Ihrer Lösung soll
  63. proportional zur Höhe des Baumes sein, aber unabhängig von der Gesamtzahl an Knoten.
  64. */
  65.  
  66.  
  67. uint16_t search_tree_get_greater_than(TreeNode *t, uint16_t x) {
  68.  
  69.     uint16_t res = x;
  70.  
  71.     TreeNode *leaf = t;
  72.     TreeNode *leaf_greater = NULL;
  73.  
  74.     while(leaf){ //baum durchsuchen
  75.         //printf("leaf->item = %d\n", leaf->item);
  76.         if(leaf->item <= x){ //schauen im rechten teilbaum, weil wir eine groessere zahl suchen
  77.             leaf = leaf->right;
  78.         }
  79.         else{ //item groesser als x, koennte entweder unsere antwort sein oder es gibt eine kleinere zahl
  80.             leaf_greater = leaf;
  81.             leaf = leaf->left;
  82.         }
  83.     }
  84.  
  85.     if (leaf_greater) res =  leaf_greater->item; // wenn ein passendes blatt gefunden (ohne dass NULL zeiger am ende des baums erreicht wurde), ist sein item unsere gesuchte zahl
  86.  
  87.     return res;
  88.  
  89. }
  90.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement