【问题标题】:Flattening a tree in haskell using in-order traversal使用中序遍历在haskell中展平一棵树
【发布时间】:2016-11-08 15:24:36
【问题描述】:

我想使用我定义的 foldTree 函数和按顺序遍历来实现对树的展平。展平后应该返回一个列表。

data Tree t = Leaf t
        | Tree (Tree t) t (Tree t)


foldTree :: (t1 -> t -> t1 -> t1) -> (t -> t1) -> Tree t -> t1
foldTree treeFn leafFn tree =
case tree of
  Leaf v -> leafFn v
  Tree leftTree q rightTree -> treeFn (foldTree treeFn leafFn leftTree) q (foldTree treeFn leafFn rightTree)


Input : foldTree (\t1 t t2->t1 + 5*t + t2) (\x->x+9) (Leaf 5)
Expected Output : 14

Input : foldTree (\t1 t t2->t1 + 3*t + t2) (\x->x+5) (Tree (Leaf 3) 2 (Leaf 4))
Expected Output : 23

我尝试了以下代码,但它使用递归。我想从 flattenTree 调用 foldTree 来实现树的展平,而不是对 flatTree 进行递归调用。(在 flattenTree 中使用 foldTree 函数)。谁能帮助我如何整合它。

flatTree :: Tree a -> [a]
flatTree tree = 
case tree of
    Leaf v -> [v]
    Tree p v r -> (flatTree p) ++ [v] ++ (flatTree r) 

Input: flatTree (Tree (Leaf 5) 3 (Tree (Leaf 3) 2 (Leaf 4)))
Expected output : [5,3,3,2,4]

【问题讨论】:

    标签: haskell functional-programming inorder


    【解决方案1】:

    查看foldTree的类型。

    foldTree :: (b -> a -> b -> b) -> (a -> b) -> Tree a -> b
    

    您可以看到b 是变质的结果类型。 foldTree 的工作原理是折叠每个子树以获得每个子树的结果 b,然后使用折叠函数将它们组合起来。

    由于您希望结果是树元素的扁平列表,因此我们设置b ~ [a]

    foldTree :: ([a] -> a -> [a] -> [a]) -> (a -> [a]) -> Tree a -> [a]
    

    所以foldTree 的第二个参数应该是将单个元素a 注入到列表[a] 中,第一个参数应该是将两个列表与一个元素组合成一个更大的列表。

    flatTree = foldTree (\xs x ys -> xs ++ x : ys) (\x -> [x])
    

    顺便说一句,GHC 能够为您编写flatTree 函数,只需查看类型的结构即可。 flatTree :: Tree a -> [a] 匹配 toList :: Foldable f => f a -> [a] 的类型,它是 Foldable 类的一部分。你需要做的就是说出神奇的话,deriving Foldable,GHC 会吐出一个Foldable 的实例。

    {-# LANGUAGE DeriveFoldable #-}
    
    data Tree t = Leaf t
                | Tree (Tree t) t (Tree t)
                deriving Foldable
    
    flatTree :: Tree a -> [a]
    flatTree = toList
    

    由于Tree 构造函数的布局方式,toList 将执行有序遍历。这可以通过调整Tree 构造函数的定义来改变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 2020-12-06
      • 2018-01-21
      • 1970-01-01
      • 2020-02-10
      • 2014-11-01
      • 2020-02-05
      相关资源
      最近更新 更多