删除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)
你可以:
[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