Piszę funkcję foldTree
budującą zbalansowane drzewo binarne z listy. Muszę użyć foldr
i jest ok, użyłem go, ale robię insertInTree
funkcji rekursywnej = (na razie wiem tylko w ten sposób, aby przejść przez drzewa =)).Buduj zbalansowane drzewo binarne z foldrem
UPDATE: nie iam pewien funkcji insertTree
: jest to prawo obliczyć wysokość w rekursji ?? = ((Potrzebuję pomocy tutaj
Czy to możliwe, aby napisać insertInTree
bez rekursji (coś z until/iterate/unfoldr
) lub dokonać foldTree
funkcji bez funkcji pomocniczych => krótszy jakoś
data Tree a = Leaf
| Node Integer (Tree a) a (Tree a)
deriving (Show, Eq)
foldTree :: [a] -> Tree a
foldTree = foldr (\x tree -> insertInTree x tree) Leaf
insertInTree :: a -> Tree a -> Tree a
insertInTree x Leaf = Node 0 (Leaf) x (Leaf)
insertInTree x (Node n t1 val t2) = if h1 < h2
then Node (h2+1) (insertInTree x t1) val t2
else Node (h1+1) t1 val (insertInTree x t2)
where h1 = heightTree t1
h2 = heightTree t2
heightTree :: Tree a -> Integer
heightTree Leaf = 0
heightTree (Node n t1 val t2) = n
wyjściowa:
*Main> foldTree "ABCDEFGHIJ"
Node 3 (Node 2 (Node 0 Leaf 'B' Leaf) 'G' (Node 1 Leaf 'F' (Node 0 Leaf 'C' Leaf))) 'J' (Node 2 (Node 1 Leaf 'D' (Node 0 Leaf 'A' Leaf)) 'I' (Node 1 Leaf 'H' (Node 0 Leaf 'E' Leaf)))
*Main>
Co sądzisz wysokość środków drzew? Czy potrafisz to zdefiniować? Czy to pasuje do tego, co wylicza insertInTree? –
Mam tylko tę definicję z mojego zadania zadania domowego: ** wysokość ** drzewa binarnego jest długością ścieżki od katalogu głównego do najgłębszego węzła. Na przykład wysokość drzewa z pojedynczym węzłem wynosi 0; wysokość drzewa z trzema węzłami, którego korzeniem jest dwoje dzieci, wynosi 1; i tak dalej. O! coś złego to obliczanie wysokości = (( –
Czy zadaniem jest utworzenie drzewa z już uporządkowanej listy? Twój rekursywny 'insertInTree' jest w porządku.możesz zrobić' foldTree = foldr insertInTree Leaf'.Czy możesz wyjaśnić, o co prosisz oprócz rzeczy typu "przegląd kodu"? – jberryman