从列表到二进制和一元树定义函数

时间:2019-02-17 22:49:25

标签: haskell recursion tree binary-tree

考虑由以下类型定义的二进制和一元树,以及将flatten转换为列表的函数flatten (Node (Leaf 10) 11 (Leaf 20))(例如,[10,11,20]data Tree a = Leaf a | Node (Tree a) a (Tree a) | UNode a (Tree a) deriving (Show) flatten :: Tree a -> [a] flatten (Leaf x) = [x] flatten (Node l x r) = flatten l ++ [x] ++ flatten r flatten (UNode l x) = [l] ++ flatten x ):< / p>

reverseflatten

我正在尝试定义一个递归函数reverseflatten :: [a] -> Tree a reverseflatten [x] = (Leaf x) reverseflatten [x,y] = UNode x (Leaf y) reverseflatten [x,y,z] = Node (Leaf x) y (Leaf z) reverseflatten [x,y,z,x'] = Node (Leaf x) y (UNode z (Leaf x') ) reverseflatten [x,y,z,x',y'] = Node (Leaf x) y ( Node (Leaf x') z (Leaf y')) reverseflatten [x,y,z,x',y',z'] = Node (Leaf x) y ( Node (Leaf x') z ( UNode y' (Leaf z'))) reverseflatten [x,y,z,x',y',z',x''] = Node (Leaf x) y ( Node (Leaf x') z ( Node (Leaf z') y' (Leaf x''))) ,该函数将列表转换为二叉树和一元树,特别是按照以下模式的方式,该函数适用于长度为< =7。我可以从示例中看到模式如何进行,但看不到如何创建递归函数:

reverse flatten[x,y,z]

我将如何创建这样的递归函数,以便对任何有限列表形成上面定义的那种二叉树?下面的答案不会这样做,因为它没有遵循上面的模式。


编辑: 对于偶数列表> 2,我遵循的过程应该是相当透明的(将树对应于奇数列表,然后添加一元节点)。 我遵循的从奇数列表构造树的一般过程是这样。 Node (Leaf x) y (Leaf z)[x, y, z, x', y']。然后对于下一个奇数列表z,我想将reverseflatten [x,y,z]保留在先前的位置,以解决z(其中z是最后一个底部右边的叶子),然后将Node (Leaf x') z (Leaf y')放置在reverseflatten [x,y,z]中,使其排在第二位,因此,这种情况的树就像z的树,不同之处在于我们添加了周围的节点右下角的叶子z。然后,我希望x'和y'以它们在列表中出现的顺序包围reverseflatten [x,y,z,x',y',z',x''],因此是Node(Leaf x')z(Leaf y')。  然后,对于下一个奇数列表y',我有一个类似的想法。我希望reverseflatten [x,y,z,x',y']保留在reverseflatten [x,y,z,x',y',z', x'']y')中的位置,以便通过将#!/bin/sh declare -a git_resources=("https://git.polarsys.org/c/capella/capella.git" "https://github.com/mbats/mindstorms") if [ ! -d "$HOME"/git ]; then mkdir "$HOME"/git fi cd "$HOME"/git || { printf "cd failed, exiting\n" >&2; return 1; } for i in ${git_resources[@]} ; do echo $i done 用z'和x''包围来构造出现在列表中。

1 个答案:

答案 0 :(得分:3)

我试图更改代码以捕获您要的模式。我的执行效率不是很高,但是目前还没有想到。 我希望我能正确理解模式。

reverseflatten :: [a] -> Tree a
reverseflatten [x] = (Leaf x)
reverseflatten [x,y] = UNode x (Leaf y)
reverseflatten [x,y,z] = Node (Leaf x) y (Leaf z)
reverseflatten (x:y:xs) = revflat2 (x:y:xs)

revflat2 :: [a] -> Tree a
revflat2 [x] = (Leaf x)
revflat2 [x,y] = UNode y (Leaf x)
revflat2 [x,y,z] = Node (Leaf x) y (Leaf z)
revflat2 (x:y:xs) = Node (Leaf x) y (revflat2 ([head $ tail xs] ++ [head xs] ++ tail (tail xs)))