我写了一个名为
foldTree
的函数,可以从列表构建平衡二叉树。我必须使用foldr
,我已经使用它了,但我让insertInTree
函数递归 =( 目前我只知道通过这种方式遍历树 =))。
更新: 我不确定insertInTree
函数是否正确在递归中计算高度? =(( 在这里需要一些帮助。
有可能编写insertInTree
函数而不使用递归(使用until/iterate/unfoldr
之类的)或使foldTree
函数没有辅助函数,从而变得更短吗?
下面是我的尝试:
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
输出:
*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>
heightTree
的时间复杂度是O(1)。 - Emil Vikström