Haskell中的树遍历

Haskell中的树遍历,haskell,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) pos

下面是一组代码,用于遍历不工作的树:

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]
我被要求执行以下任务:

Node 8 (Node 3 (Leaf 5) (Leaf 2)) (Node 1 (Leaf 9) (Leaf 6))
当我执行上述语句时,它会按原样返回,它应该返回:

preorder t = [8,3,5,2,1,9,6]

inorder t = [5,3,2,8,9,1,6]

postorder t =[5,2,3,9,6,1,8]
如何解决此问题?

您提供的:

Node 8 (Node 3 (Leaf 5) (Leaf 2)) (Node 1 (Leaf 9) (Leaf 6))
树类型的。您可以通过为该值创建绑定定义来为该值命名。如果您在源文件中工作,则只需执行以下操作

myTree = Node 8 (Node 3 (Leaf 5) (Leaf 2)) (Node 1 (Leaf 9) (Leaf 6))
或者给它一个类型签名

myTree :: Tree  -- this is the type signature
myTree = Node 8 (Node 3 (Leaf 5) (Leaf 2)) (Node 1 (Leaf 9) (Leaf 6))
如果您在解释器中工作,
ghci
,则可以使用
let
创建新定义:

Prelude> let myTree = Node 8 (Node 3 (Leaf 5) (Leaf 2)) (Node 1 (Leaf 9) (Leaf 6))
inOrderResult :: [Int]
inOrderResult = inorder myTree
当给定此树时,您的任务似乎是评估每个函数的
后序
顺序
前序
。如果您在源文件中,则需要将结果保存在定义中:

Prelude> let myTree = Node 8 (Node 3 (Leaf 5) (Leaf 2)) (Node 1 (Leaf 9) (Leaf 6))
inOrderResult :: [Int]
inOrderResult = inorder myTree
(请注意,我们将
myTree
作为参数传递给函数
顺序
),如果您使用的是
ghci
,只需键入

Prelude> inorder myTree

将结果打印到终端。

我不太理解您的问题
postorder(节点8(节点3(叶5)(叶2))(节点1(叶9)(叶6))
给出了预期的结果,将
inorder
postorder
应用到同一棵树上也给出了预期的结果。问谁?这是一个家庭作业吗?如果
t=Node 8(Node 3(Leaf 5)(Leaf 2))(Node 1(Leaf 9)(Leaf 6))
,这是可以预期的。哦!您实际上是在评估节点8(节点3(叶5)(叶2))(节点1(叶9)(叶6))
,并得到相同的结果。这是数据,您需要将其交给函数以返回新值。是的,当@amindfv写入时,启动ghci并只需键入
预排序(节点8(节点3(叶5)(叶2))(节点1(叶9)(叶6))
(并点击ender)。这将评估此树上的函数
preorder