【问题标题】:How to find the level of node in binary tree in haskell如何在haskell中找到二叉树中节点的级别
【发布时间】: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


【解决方案1】:

您应该创建一个帮助函数来跟踪树的级别。因此,您创建了一个带有签名的辅助函数path'

path' :: Int -> Tree a -> a -> Int
path' level (Node left right x) query
    | … = …
    | … = …
    | otherwise = …
path' _ Leaf _ = …

您需要在哪里填写 部分。您将需要进行递归调用以访问leftright 子树,这可以通过调用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,但这很难看)。
  • @dfeuer:是的。但是这里-1 是一个选项,因为级别不能为负数。但Maybe 当然更惯用,并允许将其与Monad 实例一起使用。
  • @WillemVanOnsem 你能详细说明一下如果我将它与路径一起使用,路径函数的主体是什么
  • 我是 Haskell 的新手,不太了解它的语法 @WillemVanOnsem
  • @Abraham: 但这已经在答案中,然后是path = path' 0,所以我们调用path',第一个参数为0,其余所有参数都相同。跨度>
猜你喜欢
  • 2014-12-16
  • 2023-03-03
  • 1970-01-01
  • 2012-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
相关资源
最近更新 更多