我是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
答案 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)