镜像一棵树

Ind*_*õue 3 haskell

任务是镜像一棵树(因此,在每个级别上,最左边的孩子变成最右边的孩子,等等)。

数据结构:

import Data.List

data Rose a = Node a [Rose a]
         deriving (Eq, Show)
Run Code Online (Sandbox Code Playgroud)

到目前为止,我得出的结论是:

mirror :: Rose a -> Rose a
mirror (Node x []) = Node x []
mirror (Node x (y:ys)) = mirror (myReverse y)

--reverses given node children
myReverse :: Rose a -> Rose a
myReverse (Node x y) = Node x (reverse y)
Run Code Online (Sandbox Code Playgroud)

因此,当我使用示例运行此代码时:

Main> mirror (Node 1 [Node 11 [Node 111 [], Node 112[]], Node 12 [Node 121[]]])
Run Code Online (Sandbox Code Playgroud)

该函数返回我,Node 112 []意味着它卡在了最左边的叶子上。从我的代码来看,这似乎是合乎逻辑的,因为我没有在传递给定节点child的尾巴y:ys。不知怎的,我必须能够扭转给定节点的第一个孩子的所有孩子通过尾巴相同的功能。无论我多么努力,我都无法做到这一点,而且看来我已经达到了逻辑思维的极限。

反向功能文档

ham*_*mar 5

我会避免像第一个孩子和其余孩子那样从小角度考虑它。相反,请尝试查看整个图片。

                a                             a
             /     \                       /     \
            b       c        ===>         c       b
          / | \    / \                   / \    / | \
         d  e  f   g  h                 h   g  f  e  d
Run Code Online (Sandbox Code Playgroud)

如果我们递归地考虑这一点,我们可以观察到可以通过以下方式镜像一棵树:

  1. 颠倒孩子的顺序。
  2. 递归地反映孩子们自己。

您已经知道如何使用reverse。要将功能f应用于列表中的每个元素,可以使用map f。尝试看看是否可以一起使用这些文件来自己解决。

扰流板:

mirror (Node a children) = Node a (reverse $ map mirror children)

  • 嘿,这是我第一次看到有人在这个网站上使用扰流板。做得好。 (2认同)