如何删除BST中的最小值?我似乎找不到保留树的方法
data BST = EmptyT
| Node Float BST BST
deriving (Eq, Show, Read)
deleteMin :: BST -> Maybe BST
deleteMin EmptyT = Nothing
deleteMin (Node x left right)
|left == EmptyT = ?
|otherwise = ?
我需要吸气剂和制定者吗?
答案 0 :(得分:5)
Haskell在OOP意义上没有“getter and setter”,尽管你可以 提出类似的概念。如果要删除二进制文件中的值 树,你必须构造一个缺少值的新树。那就是你 “保持树。”
假设您使用的是标准BST,那么树中最左边的节点就会出现
包含最小元素。所以,通过向左遍历你的树,
你最终应该遇到Node x EmptyT r
的情况。
任何其他节点,您只需递归调用左侧分支上的deleteMin
。
这给出了一个看起来像
的函数deleteMin :: BST -> Maybe BST
deleteMin EmptyT = Nothing
deleteMin (Node x EmptyT right) = Just right
deleteMin (Node x left right) =
case deleteMin left of
Nothing -> Nothing
Just nl -> Just $ Node x nl right
您必须检查每次拨打deleteMin
的结果以进行检查
Nothing
。我不认为你真的需要返回Maybe BST
,除非你
确实需要表明没有要删除的元素。它赚得更多
感觉(至少对我来说)如果没有什么可以返回一棵空树
删除。
我认为大多数人还会考虑使用模式匹配,而不是使用具有相等性检查的警卫。