【发布时间】:2021-05-17 02:31:14
【问题描述】:
我正在尝试查找某个节点所在的级别,例如,如果二叉树是:
(节点(节点(节点(节点叶子叶子9)叶子8)叶子7)叶子6)
9 级是 3
8 级是 2
7 级为 1
6级为0
有人可以在这方面帮助我吗?
函数应该是这样的:
路径 :: 树 a -> a -> Int
【问题讨论】:
-
你尝试了什么?什么不工作?
标签: haskell tree binary-tree
我正在尝试查找某个节点所在的级别,例如,如果二叉树是:
(节点(节点(节点(节点叶子叶子9)叶子8)叶子7)叶子6)
9 级是 3
8 级是 2
7 级为 1
6级为0
有人可以在这方面帮助我吗?
函数应该是这样的:
路径 :: 树 a -> a -> Int
【问题讨论】:
标签: haskell tree binary-tree
您应该创建一个帮助函数来跟踪树的级别。因此,您创建了一个带有签名的辅助函数path':
path' :: Int -> Tree a -> a -> Int
path' level (Node left right x) query
| … = …
| … = …
| otherwise = …
path' _ Leaf _ = …
您需要在哪里填写… 部分。您将需要进行递归调用以访问left 和right 子树,这可以通过调用path' 来完成,您可以使用(level+1) 作为第一个参数来调用它。
如果你实现了path',path 就是:
path :: Tree a -> a -> Int
path = path' 0
如果未找到该项目,您必须在此处返回一个类似-1 的值,因为树的级别总是大于或等于零。然而,正如@dfeuer 所说,使用Maybe Int 更为惯用,如果找不到该元素,则返回Nothing:
path' :: Int -> Tree a -> a -> Maybe Int
path' level (Node left right x) query
| … = …
| … = …
| otherwise = …
path' _ Leaf _ = …
path :: Tree a -> a -> Maybe Int
path = path' 0
在这种情况下,您还可以使用(<|>) :: Alternative f => f a -> f a -> f a 来组合递归调用的结果,从而在path' 实现中删除一行:
import Control.Applicative((<|>))
path' :: Int -> Tree a -> a -> Maybe Int
path' level (Node left right x) query
| … = …
| otherwise = … <|> …
path' _ Leaf _ = …
【讨论】:
path'(理想情况下也是path)一个Maybe Int结果(或将Nothing编码为-1,但这很难看)。
-1 是一个选项,因为级别不能为负数。但Maybe 当然更惯用,并允许将其与Monad 实例一起使用。
path = path' 0,所以我们调用path',第一个参数为0,其余所有参数都相同。跨度>