【问题标题】:Haskell traverse tree inorder preorder postorderHaskell 遍历树中序前序后序
【发布时间】:2011-03-16 19:27:26
【问题描述】:

我有以下 Haskell 数据定义:

data Tree = Leaf Int | Node Int Tree Tree deriving Show

我编写了以下程序来遍历树的前序、中序和后序:

preorder(Leaf n) = n
preorder(Node n t0 t1) = [n] ++ preorder t0 ++ preorder t1

inorder(Leaf n) = n
inorder(Node n t0 t1) = inorder t0 ++ [n] ++ inorder t1

postorder(Leaf n) = n
postorder(Node n t0 t1) = postorder t0 ++ postorder t1 ++ [n]

我得到的错误是:

- Type error in application  
*** Expression     : preorder t0 ++ preorder t1  
*** Term           : preorder t1  
*** Type           : Int  
*** Does not match : [a]  

我需要以适当的顺序返回一个包含所有树整数的列表。非常感谢任何帮助,因为我是 Haskell 的新手。

【问题讨论】:

    标签: haskell tree


    【解决方案1】:

    您从基本情况返回Int,但从建设性情况返回[Int]。叶子也应该是列表。

    【讨论】:

    • 我编辑了问题以使其更清晰。我需要返回一个包含树中所有整数的列表。你能详细说明一下吗?
    • 我想弄清楚这是否是家庭作业。但是:您在递归情况下使用[n]。那么,您认为在基本情况下应该使用什么?
    【解决方案2】:

    错误是:

    preorder(Leaf n) = n
    

    应该是:

    preorder(Leaf n) = [n] 
    

    对于 inorder 和 postorder 也是一样的。

    【讨论】:

      【解决方案3】:

      更改函数可修复错误,但您只能将元素成对插入Tree

      最好改成:

      data Tree = Leaf | Branch Int Tree Tree deriving Show
      
      inorder Leaf = []
      inorder (Branch n left right) = inorder left ++ [n] ++ inorder right
      -- etc.
      

      查看不同语言的算法实现的好页面是 Rosetta Code,它在 Tree traversals 上有一个页面,包括在 Haskell 中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-09
        • 1970-01-01
        • 1970-01-01
        • 2011-03-01
        • 1970-01-01
        • 2014-08-26
        相关资源
        最近更新 更多