我有以下练习:
定义函数list2tree,它将给定的有序列表转换为平衡树 - 此树的任何节点的右侧和左侧子树的高度最多可以相差1.
任何人都可以解释这段代码,它是如何工作的?另外我如何在控制台中测试树?
解决方案:
data Tree a = Leaf a
| Node a (Tree a) (Tree a)
| Null
list2tree [] = Null
list2tree [x] = Leaf x
list2tree list = Node x (list2tree ltx) (list2tree gtx)
where
m = length list `div` 2
x = list !! m
ltx = take m list
gtx = drop (m+1) list
答案 0 :(得分:3)
这个函数的作用是获取列表中的中间元素,将其作为节点,然后对列表的每一半进行递归。 m
是中间元素的位置ltx
(我认为它意味着"低于x")是低于x
和{{1的所有元素所有元素都高于x。
答案 1 :(得分:2)
要在GHCI中进行测试,请将Tree
设为Show
的实例:
data Tree a = Leaf a
| Node a (Tree a) (Tree a)
| Null
deriving (Show)
从命令行启动GHCI,然后加载包含Tree
和list2tree
的文件。我称之为44520938.hs
:
Prelude> :load 44520938.hs
[1 of 1] Compiling Answer ( 44520938.hs, interpreted )
Ok, modules loaded: Answer.
现在您可以使用各种输入列表调用该函数进行测试:
*Answer> list2tree []
Null
*Answer> list2tree [1]
Leaf 1
*Answer> list2tree [1, 2]
Node 2 (Leaf 1) Null
*Answer> list2tree [1, 2, 3]
Node 2 (Leaf 1) (Leaf 3)