【问题标题】:Haskell preorder traversal of binary tree二叉树的Haskell前序遍历
【发布时间】:2018-01-21 03:22:58
【问题描述】:

我正在尝试编写一个函数,该函数将遍历二叉树并返回遇到的整数列表。 我的数据树声明如下:

data Tree = Node Int Tree Tree | Leaf Int
   deriving (Eq,Show)

我的第一个想法是用以下方式启动函数:

preorder :: Tree -> [a]  --take in tree, return list of ints

但是我在网上看到有人通过使用类似于以下的函数声明格式来解决这个问题:

preorder :: (a -> c) -> (b -> c) -> Tree -> [c]

我真的不明白这条线在做什么,它需要多个输入吗?

谢谢

【问题讨论】:

    标签: haskell functional-programming binary-tree tree-traversal preorder


    【解决方案1】:

    这将取决于树的底层定义。他们可能正在使用另一种树定义,常见的是:

    data Tree a b = Leaf b | Branch a (Tree a b) (Tree a b)
    

    因此他们可能需要获取将ab 类型的值映射到c 类型的函数。由于您的树定义只有 Int 类型的元素,因此 preorder 函数的类型为 Tree -> [Int] 就足够了。

    更新:

    如果您想概括您的树的元素类型,您可以声明此数据类型:

    data Tree a = Leaf a | Node a (Tree a) (Tree a)
    

    通过这个定义,你可以定义preorder函数的类型如下:

    preorder :: Tree a -> [a]
    

    【讨论】:

    • 好的,到目前为止,在我的函数声明之后,我有这一行:“ preorder (Leaf n) = [n]” 涵盖了我的树只有一个节点的情况,在这种情况下函数将返回一个仅包含该 int 的列表。然后我有行“ preorder (Node n l r) = [n] ++ preorder l ++ preorder r ”试图组合列表并递归调用函数
    • 我需要指定这个函数返回的更多列表吗?目前使用这三行,我收到一条错误消息“无法将预期类型‘a’与实际类型‘Int’匹配”
    • 是的,因为您的类型 a 在您的定义中不受限制,因为您的树没有任意类型的元素,而是 Int 类型的元素,因此您必须解决类型 I给了你答案:preorder :: Tree -> [Int].
    • 如果你的树数据类型是这样概括的,情况会有所不同:data Tree a = Leaf a | Node a (Tree a) (Tree a)。在那里,您将拥有可以是任何类型的树(不仅是整数,而且是 a 类型),因此您可以使用数据类型 Tree Int 实例化您的 Int 树。
    • “subyacent”应该是什么?
    猜你喜欢
    • 2021-11-20
    • 2021-03-08
    • 2023-01-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    相关资源
    最近更新 更多