使用此功能,我可以删除二叉搜索树中的最小值:
data BTree a = Empty
| Node a (BTree a) (BTree a)
semmin :: BTree a -> BTree a
semmin (Node x Empty Empty) = Empty
semmin (Node x l r) = Node x (semmin l) r
我想检索最小值和没有这个最小值的树,诀窍是,我只能遍历一次。
The type is mimSmim :: BTree a -> (a,BTree a)
我应该怎么做?
编辑: 这算作一次遍历吗?
semmin :: BTree a -> (a,BTree a)
semmin (Node x Empty Empty) = (x,Empty)
semmin (Node x l r) = let i= (semmin l)
in (fst(i),(Node x (snd(i)) r))
答案 0 :(得分:3)
以下是一个提示:如果您在Node x l r
并且您已经知道左侧树的mimSmim l
是(a, l')
,那么Node
的{{1}}将是mimSmim (Node x l r)
。
答案 1 :(得分:0)
您正在寻找zipper
。 [zipper][1]
是另一种数据结构的表示,它允许您聚焦整个结构的一个部分而不会丢失其余部分。请参阅Learn You A Haskell的最后一章,了解开发zipper
数据类型和函数的直观方法。
答案 2 :(得分:0)
发布的代码在正确的轨道上,即使不完全正确:
semmin :: BTree a -> (a,BTree a)
semmin (Node x Empty Empty) = (x,Empty)
semmin (Node x l r) = let i= (semmin l)
in (fst(i),(Node x (snd(i)) r))
作为改进代码的提示,而不是以下崩溃:
semmin (Node 1 Empty (Node 2 Empty Empty))
另外,为了提高可读性,我建议:
semmin :: BTree a -> (a,BTree a)
semmin (Node x Empty Empty) = (x,Empty)
semmin (Node x l r) = let (minValue, minTree) = semmin l
in (minValue, Node x minTree r)
最后,这看起来好像它正在返回整个树,而不是找到最小值的树。检查是否是这种情况,如果这是你想要的。