Tôi viết hàm foldTree
để xây dựng cây nhị phân cân bằng từ danh sách. Tôi phải sử dụng foldr
và không sao, tôi đã sử dụng nó, nhưng tôi thực hiện insertInTree
chức năng đệ quy = (hiện tại tôi chỉ biết cách này để đi qua cây =)).Xây dựng cây nhị phân cân bằng với foldr
CẬP NHẬT: iam không chắc về chức năng insertTree
: có đúng tính toán chiều cao trong đệ quy không? = ((Cần một số trợ giúp ở đây
Có thể viết insertInTree
mà không đệ quy (cái gì đó với until/iterate/unfoldr
) hoặc làm foldTree
chức năng mà không cần chức năng helper => ngắn hơn bằng cách nào đó
đây là thử của tôi dưới đây:.?
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
đầu ra:
*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>
Bạn nghĩ gì chiều cao của các phương tiện cây? Bạn có thể định nghĩa nó không? Điều đó có khớp với những gì insertInTree tính toán không? –
Tôi chỉ có định nghĩa này từ nhiệm vụ bài tập ở nhà của tôi: Chiều cao ** ** của cây nhị phân là chiều dài của đường dẫn từ gốc đến nút sâu nhất. Ví dụ, chiều cao của một cây với một nút là 0; chiều cao của một cây có ba nút, có gốc có hai con, là 1; và vân vân. Oh! một cái gì đó sai này tính toán chiều cao = (( –
Là nhiệm vụ để tạo ra cây từ một danh sách đã được sắp xếp? Recursive 'insertInTree' của bạn là tốt. Bạn có thể làm cho' foldTree = foldr insertInTree Leaf'.Bạn có thể làm rõ những gì bạn đang hỏi bên cạnh công cụ đánh giá mã không? – jberryman