从树和树本身中检索最小值 - haskell

时间:2015-02-07 02:57:35

标签: haskell

使用此功能,我可以删除二叉搜索树中的最小值:

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))

3 个答案:

答案 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)

最后,这看起来好像它正在返回整个树,而不是找到最小值的树。检查是否是这种情况,如果这是你想要的。