Algorithm Haskell中的树合并算法

Algorithm Haskell中的树合并算法,algorithm,haskell,tree,Algorithm,Haskell,Tree,我需要一个函数,需要两棵树,检查是否有任何共同的分支出来的树干,并合并成一棵树,如果可能的话 如果节点的rootlabel相等,则可以认为节点是相同的。两棵根不同的树不能合并。可以合并具有相同根的两棵树,并且可以递归检查它们的分支以查看它们是否可以合并 有人能为通过test1和test2(即函数返回True)的函数merge(以下)提供实现建议吗?我确信有一个简单、优雅的解决方案,但目前它正在回避我。或者,我是否可以使用现有的库函数 import Data.Tree merge :: (Eq

我需要一个函数,需要两棵树,检查是否有任何共同的分支出来的树干,并合并成一棵树,如果可能的话

如果节点的
rootlabel
相等,则可以认为节点是相同的。两棵根不同的树不能合并。可以合并具有相同根的两棵树,并且可以递归检查它们的分支以查看它们是否可以合并

有人能为通过
test1
test2
(即函数返回
True
)的函数
merge
(以下)提供实现建议吗?我确信有一个简单、优雅的解决方案,但目前它正在回避我。或者,我是否可以使用现有的库函数

import Data.Tree

merge :: (Eq a) => Tree a -> Tree a -> Either (Tree a, Tree a) (Tree a)
merge = undefined

test1 :: Bool
test1 = 
    Node 'a' 
            [Node 'b' 
                [Node 'c' 
                    [], 
                Node 'g' 
                    []], 
            Node 'd' 
                []]
    `merge`
    Node 'a' 
            [Node 'b' 
                [Node 'c' 
                    [Node 'h'
                        []]], 
            Node 'e' 
                [Node 'f' 
                    []]]
    == 
    Right 
    (Node 'a' 
        [Node 'b' 
            [Node 'c' 
                [Node 'h'
                    []], 
            Node 'g' 
                []], 
        Node 'd' 
            [],
        Node 'e' 
            [Node 'f' 
                []]])

test2 :: Bool
test2 =  
    let l = Node 'a' []
        r = Node 'b' []
    in  l `merge` r == Left (l,r)

我想我终于明白了

merge :: (Eq a) => Tree a -> Tree a -> Either (Tree a, Tree a) (Tree a)
merge l r = 
    if rootLabel l == rootLabel r
        then Right $ merge' l r 
        else Left (l,r)

merge' :: (Eq a) => Tree a -> Tree a -> Tree a
merge' l r = l { subForest = foldl mergeNode (subForest l) (subForest r) }

mergeNode :: Eq a => [Tree a] -> Tree a -> [Tree a]
mergeNode [] y = [y]
mergeNode (x:xs) y 
    | rootLabel x == rootLabel y = x `merge'` y : xs
    | otherwise = x : xs `mergeNode` y

那么,如果根是公共根,但分支不是,会发生什么?@n.m.那么结果将是一棵具有公共根的树,以及来自两棵原始树的所有分支。如果看到
test1
,左树有一个分支“d”,它不在右树中。结果包含两个树的所有分支,包括分支“d”。@DanielWagner我还没有找到一个通过类型检查的解决方案来显示您所得到的结果。