2017-06-13 40 views
0

我有以下运动:哈斯克尔转换有序列表的成平衡树〜代码说明

定义功能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 
+1

究竟你不明白有关的代码?你试过什么了? –

回答

3

什么这个功能确实走的是中间元素在列表中,把它作为节点然后迭代该列表的每半。 m是中间元件的位置,ltx(我认为是指“低于x”)是所有元件低,比xgtx都高于X的元素。

2

为了在GHCI进行测试,使TreeShow一个实例:

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) 
+0

后在那里,我无法理解这样的代码是如何工作的,我需要记住这个练习对我的考验。但了解它的工作原理非常重要 – csandreas1