【问题标题】:Haskell binary trees traversal order with foldHaskell二叉树遍历顺序与折叠
【发布时间】:2021-05-04 21:34:36
【问题描述】:

我定义了自己的数据类型BinTree,它描述了我的二叉树:

data BinTree a = Empty | Node a (BinTree a) (BinTree a) deriving (Show,Eq)

之后我为二叉树实现了三个排序函数:preorderinorderpostorder

preorder :: BinTree a -> [a]
preorder Empty = []
preorder (Node x lt rt) = [x] ++ preorder lt ++ preorder rt

inorder :: BinTree  a -> [a]
inorder Empty = []
inorder (Node x lt rt) = inorder lt ++ [x] ++ inorder rt

postorder :: BinTree a -> [a]
postorder Empty = []
postorder (Node x lt rt) = postorder lt ++ postorder rt ++ [x]

为了改进我的排序函数,我实现了 foldTree 函数(它与普通的 foldr 函数一样工作,但使用二叉树):

foldTree :: (a -> b -> b -> b) -> b -> BinTree -> b
    foldTree f e Empty = e
    foldTree f e (Node x lt rt) = f x (foldTree f e lt) (foldTree f e rt)

现在我被卡住了,因为我不知道如何将 order-functions 与 foldTree 结合起来。

有人可以给我提示吗?

【问题讨论】:

    标签: haskell binary-tree fold inorder preorder


    【解决方案1】:

    如果“组合”是指使用最后一个函数实现三个函数中的每一个,那么 my recent answer 似乎很有用,例如

    preorder  t  =  foldTree (\a l r -> (a :) . l . r) id t []
    inorder   t  =  foldTree (\a l r -> l . (a :) . r) id t []
    postorder t  =  foldTree (\a l r -> l . r . (a :)) id t []
    

    试一试:

    > t = Node 1 (Node 2 Empty (Node 3 Empty Empty)) (Node 4 (Node 5 Empty Empty) Empty)
    {-
                     1
            2                 4
         .      3         5       .
              .   .     .   .
    -}
    
    > inorder t
    [2,3,1,5,4]
    
    > preorder t
    [1,2,3,4,5]
    
    > postorder t
    [3,2,5,4,1]
    

    你的函数的正确类型当然是

    foldTree :: (a -> b -> b -> b) -> b -> BinTree a -> b
    --                                            ^^^
    

    【讨论】:

      猜你喜欢
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-01
      相关资源
      最近更新 更多