在Haskell中构建一棵树

时间:2014-09-07 21:02:30

标签: haskell

我是Haskell的新手,我正在尝试构建一个保存整数的树,左子树中的每个元素都是< = node value。 这是我到目前为止编写的代码,但我不知道如何在内部进行递归。如果你能给我一些指导,我将不胜感激。

data Tree = Leaf | Node Int Tree Tree
    deriving (Eq, Show, Read, Ord)

insert :: Int -> Tree -> Tree
insert x (Tree n i t1 t2) = 

据我所知,我必须检查树的每个节点,看看是否有一个int,然后递归搜索子树。 请帮忙

感谢

编辑:

我设法做了一些事情,但似乎新节点无法创建或我检查错了,这是新代码:

data Tree = Leaf | Node Int Tree Tree
    deriving (Eq, Show, Read, Ord)

insert :: Int -> Tree -> Tree
insert x Leaf = Node x Leaf Leaf
insert x (Node i t1 t2)  
              | x <= i    = insert x t1
              | otherwise = insert x t2

要检查它,我写道:

let tree = insert 5 (insert 10 ( insert 11 ( insert 12 (insert 15 tree))))

但是当我写在ghci:

tree

我明白了:

Node 5 Leaf Leaf

2 个答案:

答案 0 :(得分:2)

Node的递归案例的问题在于,虽然您致电insert在左侧或右侧创建新的子树,但您之后不会重建父树。 ,你只需返回新的子树。

例如,第一种情况应该是Node i (insert x t1) t2,对于第二种情况也是如此。

答案 1 :(得分:2)

当您insert进入某个节点时,您将insert的内容返回到Node的一侧,而不是带有数据的新Node insert加入其中一侧。只有在Leaf级别才能创建新节点。

insert :: Int -> Tree -> Tree
insert x Leaf = Node x Leaf Leaf
insert x (Node i t1 t2)  
          | x <= i    = Node i (insert x t1)  t2
          | otherwise = Node i  t1           (insert x t2)