data Tree a = Node (Tree a) a (Tree a) | Nil deriving Show -- binarni strom ze zoznamu treeToList :: Tree a -> [a] treeToList Nil = [] treeToList (Node l v r) = (treeToList l) ++ [v] ++ (treeToList r) listToTree :: [a] -> Tree a listToTree [] = Nil listToTree s = let l = length s `div` 2 lp = take l s (c:pp) = drop l s in (Node (listToTree lp) c (listToTree pp)) -- vyhledani prvku ve strome + reakce na selhani hladaj :: Ord a => Tree a -> a -> Bool hladaj Nil a = False hladaj (Node l c r) x | x == c = True | x < c = hladaj l x | otherwise = hladaj r x -- vybrat n-ty nejmensi prvek ze stromu treeSize :: Tree a -> Int treeSize Nil = 0 treeSize (Node l c r) = treeSize l + treeSize r + 1 nth :: Tree a -> Int -> Maybe a nth Nil n = Nothing nth (Node l c r) n | treeSize l > n = nth l n | treeSize l < n = nth r (n - treeSize l -1) | otherwise = Just c -- nekonecny strom s pascalovym trojuhelnikem, treeTake data Pastree = Pastree Int Pastree Pastree deriving Show vyrobPastree :: Pastree vyrobPastree = Pastree 1 (vPt [1,1] 0) (vPt [1,1] 1) --vPt :: [Int] -> Int -> Pastree vPt l o = let novyseznam = zipWith (+) (l ++ [0]) (0:l) in Pastree (l!!o) (vPt novyseznam o) (vPt novyseznam (o + 1)) pasDemo = let Pastree _ l _ = vyrobPastree Pastree _ _ r = l Pastree _ _ r' = r Pastree n _ _ = r' in n takeTree :: Int -> Pastree -> Tree Int takeTree 0 _ = Nil takeTree n (Pastree a l r) = Node (nxt l) a (nxt r) where nxt = takeTree (n-1)