【问题标题】:Print out a Binary Tree [duplicate]打印出二叉树[重复]
【发布时间】:2016-06-11 13:59:25
【问题描述】:

这是我的指导方针:

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

现在我想创建一个函数:

levels :: BinTree a -> [[a]]

这应该打印出一个列表中的二叉树,但每个级别都有自己的。例如:[[1],[2,3],[4,5,6,7]]

[1]
[2,3]
[4,5,6,7]

...

我定义了rootschilds

roots ts = [ a | Node _ a _ <- ts ]
childs ts = [ t | Node l _ r <- ts, t <- [l, r] ]

还有一个遍历函数,它获取子树及其节点的列表。

traverse' :: [BinTree α] -> [α]
traverse' [] = []
traverse' ts = roots ts ++ traverse' (childs ts)

levels :: BinTree α -> [α]
levels t = traverse [t]

但这不是我真正想要的。有人有想法吗。

【问题讨论】:

  • 尝试编写f :: BinTree a -&gt; [[a]],它将二叉树转换为列表列表,其中第一个列表包含根,第二个列表包含子项,下一个包含孙子项,依此类推。在那之后你就差不多完成了。
  • 否则看看this的问题,可能有助于设计功能。
  • 考虑如何根据左右子节点的级别来表达节点的级别。你被介绍过zip函数了吗?
  • levels ts = roots ts : levels (childs ts)
  • 我的问题是,我不知道如何将其打印出来。

标签: haskell binary-tree


【解决方案1】:

这很好用:

f Empty = []
f (Node l v r) = case (f l, f r) of
                   ((x:xs),(y:ys)) -> [[v],x++y] ++ (zipWith (++) xs ys)
                   ([],[])         -> [[v]]
                    ......

完成图案。 (你可以用一棵完整的树来测试它,以确保它是一个好的开始)。

【讨论】:

    猜你喜欢
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多