【发布时间】:2015-01-25 20:12:28
【问题描述】:
任务是在 Haskell 的树中找到给定 x 的前一个值。重要的!不允许在任何部分使用列表:
data SearchTree a = Leaf a | Node a (SearchTree a) (SearchTree a)
t1 = Node 5 ( Node 4 ( Leaf 1)
( Node 5 (Leaf 4) (Leaf 5))
)
( Node 7 ( Node 6 ( Leaf 5 ) ( Leaf 7 ))
( Node 10 ( Leaf 9 ) ( Leaf 11 ))
)
previousVal :: Ord a => a -> (SearchTree a) -> a
previousVal x t = previousValHelp x t
previousValHelp x (Leaf n) = error "Es gibt nichts kleineres"
previousValHelp x (Node n l r) = (max n (max (previousValHelp x l) (previousValHelp x r))) < x
例如previousVal 9 t1 应该给7。
我设法制作了这段代码,但它是错误的......这里有人有想法吗?
谢谢!
【问题讨论】:
-
最近有很多关于二叉搜索树的问题。这是讲座的一部分吗?顺便说一句,
previousVal :: Ord a => a -> SearchTree a -> Maybe a会更安全一些。 -
恐怕我不太明白你的问题。你能解释一下为什么它应该返回
7给定9和t1并输入?另外,我真的没有看到制作previousValHelp函数的意义。previousVal只是直接调用它,不做任何其他事情。为什么不按照previousValHelp的方式定义previousVal? -
你认为
previousVal 5 t1应该是什么?previousVal 8 t1呢? -
我建议您阅读有关zippers 的内容,然后将其概括为在给定元素之前或之后查找元素
n。