Haskell将有序列表转换为平衡树〜代码解释

时间:2017-06-13 12:00:25

标签: haskell

我有以下练习:

定义函数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

2 个答案:

答案 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,然后加载包含Treelist2tree的文件。我称之为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)