给定以下数据结构,创建一个给出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)
最后一行代码是不起作用的代码和我无法理解的代码
答案 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
如果我在手工操作时没有搞砸,那就是理想的结果。