删除BST Haskell中的最小值

2 haskell binary-search-tree

如何删除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 = ?
Run Code Online (Sandbox Code Playgroud)

我需要吸气剂和二传手吗?

sab*_*uma 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
Run Code Online (Sandbox Code Playgroud)

您必须检查每个呼叫的结果以deleteMin进行检查 Nothing.我不认为你真的需要返回一个Maybe BST,除非你真的需要表明没有要删除的元素.如果没有什么可以删除的话,那么(至少对我来说)返回空树更有意义.

我认为大多数人也会考虑使用模式匹配,而不是使用带有相等性检查的警卫.

  • 只是注意,在最后一个等式中,`deleteMin left`永远不会是'Nothing`. (3认同)