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
. 我不认为你真的需要返回 a Maybe BST
,除非你真的需要表明没有要删除的元素。如果没有要删除的内容,则返回一棵空树更有意义(至少对我而言)。
我认为大多数人也会考虑使用模式匹配,而不是使用带有相等检查的守卫。