将列表插入 Haskell 中的二叉树
Inserting list into Binary Tree in Haskell
基本上,我试图将列表中的元素一个一个地插入到二叉树中,或者这就是我认为将列表插入到树中时应该做的。
这是我要插入的树:
data Tree = EmptyTree | Node Integer Tree Tree deriving (Show, Eq, Ord)
insertElement x EmptyTree = Node x EmptyTree EmptyTree
insertElement x (Node a left right) = if x == a
then (Node x left right)
else if x < a
then (Node a (insertElement x left) right)
else
Node a left (insertElement x right)
而且我想我可以使用 map 从列表中获取元素并将其插入到列表中。
像这样:inserter x = map (insertElement x EmptyTree)
我在哪里得到带有插入器的列表并将其插入到列表中。
但是,我认为这段代码很不正确,我想知道我该怎么做?
如果您使用 inserter xs = map (`insertElement` EmptyTree)
,您将创建一个树列表,其中每个项目都被插入一次。
你可以做的是使用foldl :: Foldable t => (b -> a -> b) -> b -> t a -> b
or foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b
每次通过累加器,到目前为止构建列表,从而插入下一个项目,所以:
inserter :: Foldable f => f Integer -> Tree
inserter = foldr insertElement EmptyTree
或:
inserter :: Foldable f => f Integer -> Tree
inserter = foldl (flip insertElement) EmptyTree
然而,允许指定基础树可能更有意义,因此使用 inserter
将 Foldable
项插入到可能已经包含项的 Tree
中,例如:
inserter :: Foldable f => Tree -> f Integer -> Tree
inserter = foldl (flip insertElement)
基本上,我试图将列表中的元素一个一个地插入到二叉树中,或者这就是我认为将列表插入到树中时应该做的。
这是我要插入的树:
data Tree = EmptyTree | Node Integer Tree Tree deriving (Show, Eq, Ord)
insertElement x EmptyTree = Node x EmptyTree EmptyTree
insertElement x (Node a left right) = if x == a
then (Node x left right)
else if x < a
then (Node a (insertElement x left) right)
else
Node a left (insertElement x right)
而且我想我可以使用 map 从列表中获取元素并将其插入到列表中。
像这样:inserter x = map (insertElement x EmptyTree)
我在哪里得到带有插入器的列表并将其插入到列表中。
但是,我认为这段代码很不正确,我想知道我该怎么做?
如果您使用 inserter xs = map (`insertElement` EmptyTree)
,您将创建一个树列表,其中每个项目都被插入一次。
你可以做的是使用foldl :: Foldable t => (b -> a -> b) -> b -> t a -> b
or foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b
每次通过累加器,到目前为止构建列表,从而插入下一个项目,所以:
inserter :: Foldable f => f Integer -> Tree
inserter = foldr insertElement EmptyTree
或:
inserter :: Foldable f => f Integer -> Tree
inserter = foldl (flip insertElement) EmptyTree
然而,允许指定基础树可能更有意义,因此使用 inserter
将 Foldable
项插入到可能已经包含项的 Tree
中,例如:
inserter :: Foldable f => Tree -> f Integer -> Tree
inserter = foldl (flip insertElement)