artyom_h31

Haskell Task 2

Oct 20th, 2015
270
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import Text.Printf
  2.  
  3. data BinaryTree = EmptyTree
  4.         | Node Integer BinaryTree BinaryTree
  5.  
  6. -- Добавление элемента
  7. insert :: BinaryTree -> Integer -> BinaryTree
  8. insert EmptyTree y = Node y EmptyTree EmptyTree
  9. insert (Node value left right) y
  10.         | (y == value) = Node value left right
  11.         | (y > value) = Node value left (insert right y)
  12.         | (y < value) = Node value (insert left y) right
  13.  
  14. -- Удаление элемента
  15. remove :: BinaryTree -> Integer -> BinaryTree
  16. remove EmptyTree _ = error "No such element"
  17. remove (Node value left right) y
  18.         | (y > value) = Node value left (remove right y)
  19.         | (y < value) = Node value (remove left y) right
  20.         | (y == value) = removeNode (Node value left right) y
  21.  
  22. removeNode :: BinaryTree -> Integer -> BinaryTree
  23. removeNode (Node value EmptyTree EmptyTree) y = EmptyTree
  24. removeNode (Node value left EmptyTree) y = left
  25. removeNode (Node value EmptyTree right) y = right
  26. removeNode (Node value left right) y =
  27.         let nearest = nearestGE right value in
  28.         Node nearest left (remove right nearest)
  29.  
  30. -- Создание пустого дерева
  31. emptyTree :: BinaryTree
  32. emptyTree   = EmptyTree
  33.  
  34. --Поиск элемента в дереве
  35. containsElement :: BinaryTree -> Integer -> Bool
  36. containsElement EmptyTree _ = False
  37.  
  38. containsElement (Node value left right) y  
  39.         | (y == value) = True
  40.         | (y < value) = containsElement left y
  41.         | (y > value) = containsElement right y
  42.  
  43. -- Поиск в дереве наименьшего элемента, который больше или равен заданному
  44. nearestGE :: BinaryTree -> Integer -> Integer
  45. nearestGE EmptyTree y = y-1 -- вернем заведомо неподходящее решение
  46. nearestGE (Node x left right) y
  47.         | (x == y) = y
  48.         | (x < y) = nearestGE right y -- текущий узел заведомо не подходит, остается только искать вглубь
  49.         | (x > y) = let result = nearestGE left y in
  50.             if result >= y then min x result else x -- минимальное из найденных, но при этом корректное
  51.  
  52. -- Создание дерева из списка
  53. treeFromList :: [Integer] -> BinaryTree
  54. treeFromList list = foldl insert EmptyTree list
  55.  
  56. -- Создание списка из дерева
  57. listFromTree :: BinaryTree -> [Integer]
  58. listFromTree EmptyTree = []
  59. listFromTree (Node x left right) = (listFromTree left) ++ x : (listFromTree right)
  60.  
  61. -- Вывод в формате Graphviz
  62. treeToDot :: BinaryTree -> String
  63. treeToDot (Node x left right) = printf "digraph BST {\n%s%s}\n" (showNode left "left" x) (showNode right "right" x);
  64.  
  65. showNode :: BinaryTree -> String -> Integer -> String
  66. showNode EmptyTree name parent = printf "null_%d_%s [shape=point];\n%d -> null_%d_%s;\n" parent name parent parent name
  67. showNode (Node x left right) name parent =
  68.         (printf "%d -> %d;\n" parent x) ++ (showNode left "left" x) ++ (showNode right "right" x)
  69.  
  70. instance Show BinaryTree where
  71.   show t = treeToDot t
  72.  
  73. -- "dot -Tps2 graph.dot -o graph.ps" for multipage
  74. main = do
  75.         let tree1 = treeFromList [7,3,11,5]
  76.         putStrLn (show tree1)
  77.         putStrLn (show (tree1 `insert` 4 `insert` 1))
  78.         putStrLn (show (remove tree1 3))
Advertisement
Add Comment
Please, Sign In to add comment