删除Haskell中树中的元素

删除Haskell中树中的元素,haskell,tree,Haskell,Tree,我要做的是获取一个二叉搜索树和一个元素,然后将其从树中删除 (如果有) 这是我的密码: data BinaryTree a = Null | Node (BinaryTree a) a (BinaryTree a) deriving Show type BSTree a = BinaryTree a treeDelete :: (Ord a) => (BSTree a) -> a -> (BSTree a) treeDelete a btree = case btree

我要做的是获取一个二叉搜索树和一个元素,然后将其从树中删除 (如果有)

这是我的密码:

data BinaryTree a = Null | Node (BinaryTree a) a (BinaryTree a)
  deriving Show

type BSTree a = BinaryTree a

treeDelete :: (Ord a) => (BSTree a) -> a -> (BSTree a)
treeDelete a btree = case btree of
  Null -> Null
  Node Null val Null
     |a==val -> Null
     |otherwise -> Node Null val Null
  Node left val right
         |a==val-> Node left Null right
         |otherwise -> (treeDelete a left) val (treeDelete a right)
你可以:

  • 将数据结构定义更改为
  • 这是一个简化的trie,由
    [Bool]
    键控

    < LI>定义一个旋转行为(如平衡树),在删除后填入空白。旋转不是唯一的。例如,对于容器包中的惰性映射,平衡树的删除定义为:
    balanceR
    balanceL
    glue
    是平衡树中平衡深度的旋转。

    用另一个(定义旋转行为)替换一个未知项(删除一个项目)没有多大帮助。同意,我想我稍后会用容器中的示例代码更新我的答案。谢谢你修改我的答案。定义
    bTree
    有什么意义?问题是
    Null
    不是
    a
    类型的值;它是一个类型为
    BinaryTree a
    的值。您对
    BinaryTree
    的定义不允许只在树上打“洞”。如果删除树的根,则必须将其替换为两个子树之一的值,这也需要对该子树进行一些修改。
    data BinaryTree a = Null | Node (BinaryTree a) (Maybe a) (BinaryTree a)
    
    data Map k a  = Bin Size k a (Map k a) (Map k a)
                  | Tip
    
    type Size     = Int
    
    delete :: Ord k => k -> Map k a -> Map k a
    delete = go
      where
        go :: Ord k => k -> Map k a -> Map k a
        go !_ Tip = Tip
        go k t@(Bin _ kx x l r) =
            case compare k kx of
                LT | l' == l -> t
                   | otherwise -> balanceR kx x l' r
                   where l' = go k l
                GT | r' == r -> t
                   | otherwise -> balanceL kx x l r'
                   where r' = go k r
                EQ -> glue l r