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
。