将GenTree转换为二叉树的功能

时间:2017-04-17 17:27:36

标签: algorithm haskell

给定以下数据结构,创建一个给出GenTree的函数,将其转换为BinTree

  • 每个按顺序NodeG匹配二进制树中的NodeB节点;
  • NodeB的左儿子与NodeG;
  • 的第一个儿子相匹配
  • NodeB的右儿子是NodeG之后的下一个节点(这意味着NodeG父母的孩子之间的下一个节点)

视觉示例(GenTree左,BinTree右)

    1                       1
/ |  |  \                  / \
2 3  4   5                2   E  
    /|\                  / \
   6 7 8                E   3
                           / \
                          E   4
                             / \
                            6   5
                           / \
                          E   7
                             / \
                            E   8  
data GenTree a = EmptyG | NodeG a [GenTree a]
                                         deriving (Show)

data BinTree a = EmptyB | NodeB (BinTree a) a (BinTree a)
                                                     deriving (Show)

。我无法弄清楚如何使主函数的辅助函数(aux)工作。

g2b :: (GenTree a) -> (BinTree a)

g2b EmptyG = EmptyB
g2b (NodeG x ts) = NodeB (aux ts) x EmptyB

aux :: [GenTree a] -> (BinTree a)

aux [] = EmptyB
aux (NodeG x xs) : xss = NodeB (aux xs) x (aux xss) ((NodeG x xs) xss)

最后一行代码是不起作用的代码和我无法理解的代码

1 个答案:

答案 0 :(得分:3)

如果节点是EmptyG,我不确定应该返回什么,例如:

   1
 / | \
E  2  3

我这样做aux (EmptyG:xs)= EmptyB,但没有多大意义。在这种情况下的问题是放在a中的值,这样你就不会丢失树的其余部分(xs)。

无论如何,此代码适用于没有EmptyG的情况:

aux :: [GenTree a] -> (BinTree a)
aux [] = EmptyB
aux (EmptyG:xs)= EmptyB  
aux ((NodeG x []):xs) = NodeB (EmptyB) x (aux xs)
aux ((NodeG x ys):xs) = NodeB (aux ys) x (aux xs)

从你的例子:

(NodeG 1 [NodeG 2 [], NodeG 3 [], NodeG 4 [NodeG 6 [], NodeG 7 [], NodeG 8 []], NodeG 5[]])

它产生:

NodeB (NodeB EmptyB 2 (NodeB EmptyB 3 (NodeB (NodeB EmptyB 6 (NodeB EmptyB 7 (NodeB EmptyB 8 EmptyB))) 4 (NodeB EmptyB 5 EmptyB)))) 1 EmptyB

如果我在手工操作时没有搞砸,那就是理想的结果。