Advertisement
Guest User

Untitled

a guest
Nov 18th, 2018
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Wir beginnen mit dem Datentyp eines Suchbaums:
  2.  
  3. 1
  4. 2
  5. data SearchTree = Empty | Branch SearchTree Int SearchTree
  6.   deriving (Eq, Show)
  7. Die insert-Funktion fügt ein Element nur ein, wenn es noch nicht vorhanden ist. In dem Fall wird für das Element ein neues Blatt erzeugt und so in den Baum gehängt, dass es rechts von kleineren und links von größeren Elementen steht.
  8.  
  9. 3
  10. 4
  11. 5
  12. 6
  13. 7
  14. 8
  15. insert :: Int -> SearchTree -> SearchTree
  16. insert x Empty          = Branch Empty x Empty
  17. insert x (Branch l n r)
  18.   | x == n    = Branch l n r
  19.   | x <  n    = Branch (insert x l) n r
  20.   | otherwise = Branch l n (insert x r)
  21. Die Funktion isElem nutzt die Ordnung des Baums, um die richtige Beschriftung zu finden:
  22.  
  23. 9
  24. 10
  25. 11
  26. 12
  27. 13
  28. 14
  29. isElem :: Int -> SearchTree -> Bool
  30. isElem _ Empty          = False
  31. isElem x (Branch l n r)
  32.   | x == n    = True
  33.   | x <  n    = isElem x l
  34.   | otherwise = isElem x r
  35. Zum Löschen einer Beschriftung gibt es unterschiedliche Strategien. Knoten mit weniger als zwei nicht-leeren Teilbäumen können einfach gelöscht werden, aber andere Knoten nicht, da dann zwei nicht-leere Teilbäume zu einem einzigen kombiniert werden müssen.
  36.  
  37. Eine einfache Möglichkeit ist, den linken Teilbaum ganz links im rechten einzufügen oder umgekehrt. Dadurch wird die Höhe des Baumes aber unnötig groß. Besser ist es, eine geeignete Beschriftung aus einem der Teilbäume zu löschen und diese an die frei gewordene Stelle zu schreiben. Man kann entweder die größte (rechteste) Beschriftung des linken oder die kleinste (linkeste) des rechten Teilbaumes an diese Stelle schreiben.
  38.  
  39. Für letzteres benötigt man eine Funktion splitMin, die die kleinste Beschriftung eines sortierten Baumes und den Restbaum als Ergebnis liefert. Da Funktionen nur ein Ergebnis liefern können, liefern wir ein Paar aus beiden Teilen:
  40.  
  41. 15
  42. 16
  43. 17
  44. 18
  45. 19
  46. splitMin :: SearchTree -> (Int, SearchTree)
  47. splitMin Empty              = error "splitMin: empty search tree"
  48. splitMin (Branch Empty n r) = (n, r)
  49. splitMin (Branch l     n r) = (m, Branch t n r)
  50.   where (m, t) = splitMin l
  51. Die splitMin Funktion ist partiell, da sie nur für nicht-leere Bäume definiert ist. Sie wird aber auch nur auf solchen aufgerufen.
  52.  
  53. Mit ihrer Hilfe können wir delete implementieren. Da jede Beschriftung höchstens einmal im Baum vorkommt, genügt es, die erste gefundene zu entfernen.
  54.  
  55. 20
  56. 21
  57. 22
  58. 23
  59. 24
  60. 25
  61. 26
  62. 27
  63. 28
  64. 29
  65. 30
  66. 31
  67. 32
  68. 33
  69. 34
  70. delete :: Int -> SearchTree -> SearchTree
  71. delete _ Empty              = Empty
  72. delete x (Branch Empty n r)
  73.   | x == n    = r
  74.   | x <  n    = Branch Empty n r
  75.   | otherwise = Branch Empty n (delete x r)
  76. delete x (Branch l n Empty)
  77.   | x == n    = l
  78.   | x <  n    = Branch (delete x l) n Empty
  79.   | otherwise = Branch l            n Empty
  80. delete x (Branch l n r)
  81.   | x == n    = Branch l            m t
  82.   | x <  n    = Branch (delete x l) n r
  83.   | otherwise = Branch l            n (delete x r)
  84.   where (m, t) = splitMin r
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement