将列表插入 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

然而,允许指定基础树可能更有意义,因此使用 inserterFoldable 项插入到可能已经包含项的 Tree 中,例如:

inserter :: Foldable f => Tree -> f Integer -> Tree
inserter = foldl (flip insertElement)