Listeden dengeli ikili ağaç oluşturan foldTree
işlevini yazarım. foldr
kullanmalıyım ve sorun değil, kullandım ama insertInTree
fonksiyonunu tekrarlıyorum = (şimdilik sadece ağaçların arasından yürümek için bu yolu biliyorum =)).Buildr ile dengeli ikili ağaç oluşturma
UPDATE: işlev hakkında emin değilim. insertTree
: doğrudur. . = ((O until/iterate/unfoldr
ile (bir şey) özyineleme olmadan insertInTree
yazmak mümkün mü
burada yardıma ihtiyacım veya yardımcı işlevleri olmadan foldTree
fonksiyonunu yapmak => daha kısa bir şekilde
bu aşağıda benim deneyin geçerli:?
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
çıkışı:
*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>
ağaç araçlarının yüksekliğini ne düşünüyorsunuz:
Görünüşe göre, kod fazladan koşulu ekledikten çalıştık ki? Tanımlayabilir misin? InsertInTree'nin hesapladığıyla uyuşuyor mu? –
Ev ödevimden yalnızca bu tanıma sahibim: İkili bir ağacın ** yüksekliği ** kökten en derin düğüme giden bir yolun uzunluğudır. Örneğin, tek bir düğüme sahip bir ağacın yüksekliği 0'dır; Kökünün iki çocuğu olan üç düğümlü bir ağacın yüksekliği 1'dir; ve bunun gibi. Ah! bir şey yanlış bu yükseklik hesaplama = (( –
Zaten bir listeden bir ağaç oluşturmak için görev mi? Özyinelinizi 'insertInTree' iyidir.Tamam 'foldTree = foldr insertInTree Leaf' yapabilirsiniz.Kod inceleme türünden başka ne istediğini açıklayabilir misiniz? – jberryman