树中的关系(Haskell)

时间:2018-01-26 06:49:14

标签: haskell tree functional-programming

叶子和节点中具有值的二叉树由以下内容定义:

   data Tree a = Leaf a
                | Node a (Tree a) (Tree a) 
     deriving (Eq, Show)

例如,

         10
        /  \
       /    \
      8      2
     / \    / \
    3   5  2   0

exTree :: Tree Int
exTree = N 10 (N 8 (H 3) (H 5))
               (N 2 (H 2) (H 0))

好吧,我需要一个名为RelationshipBinaryTree的函数,它生成一个元组列表,其第一个组件是x,第二个组件是父组件。在这棵树上,

relationshipBinaryTree :: Tree a -> [(a,a)]
relationshipBinaryTree exTree =  [(10,8),(8,3),(8,5),(10,2),(2,2),(2,0)]

另外,我需要在Data.Tree hackage(https://hackage.haskell.org/package/containers-0.5.11.0/docs/Data-Tree.html)中定义它

我希望你能帮助我,因为我不太了解树木和图表。

我试过这个

relationshipBinaryTree :: Tree a -> [(a,a)] 
 relationshipBinaryTree (L _) = [] 
 relationshipBinaryTree (N _ (Tree i) (Tree d)) = relationshipBinaryTree (N _) ++ relationshipBinaryTree (Tree i) ++ relationshipBinaryTree (Tree d)

2 个答案:

答案 0 :(得分:3)

你想使用Data.Tree,但Data.Tree甚至不是关于二叉树,而是关于多路树(a.k.a。玫瑰树)。但是,如果你有一个函数value :: Tree a -> a,那么当然你可以将它映射到玫瑰树的子节点并将结果与​​值组合。

现在,存在一个在Data.Tree中执行该功能的功能,它被称为rootLabel。并且还有另一个功能来确定节点的子节点,它被称为subForest

来自TreeData.Tree的定义:

Node
   rootLabel :: a           -- label value
   subForest :: Forest a    -- zero or more child trees

所以我们可以定义玫瑰树:

fatherChild :: Tree a -> [(a, a)]
fatherChild t = map mkPair children ++ concatMap fatherChild children
   where mkPair child = (rootLabel t, child)
         children     = subForest t

示例:

fatherChild (Node 3 [Node 8 [], Node 4 []])
> [(3,8),(3,4)]

你的例子:

fatherChild (Node 10 [Node 8 [Node 3 [], Node 5 []], Node 2 [Node 2 [], Node 0 []]])
> [(10,8),(10,2),(8,3),(8,5),(2,2),(2,0)]

现在,这并没有回答你关于二进制树的问题,但是我想把它作为练习留给你,因为它会非常相似(除非你被卡住了) )。 (并且请不要使用玫瑰树作为二叉树,因为没有类型安全,以确保总有两个孩子。)

答案 1 :(得分:1)

一种简单的方法是使用辅助函数获取值,然后执行递归:

data Tree a = Leaf a
              | Node a (Tree a) (Tree a) deriving (Eq, Show)


exTree :: Tree Int
exTree = Node 10 t1 t2
t1 = Node 8 (Leaf 3) (Leaf 5)
t2 = Node 2 (Leaf 2) (Leaf 0)


relationshipBinaryTree :: Tree a -> [(a,a)] 
relationshipBinaryTree (Leaf _) = [] 
relationshipBinaryTree (Node v i d) = [(v, getVal i), (v, getVal d)] ++ relationshipBinaryTree i ++ relationshipBinaryTree d

getVal (Node v _ _) = v
getVal (Leaf v) = v

   relationshipBinaryTree exTree
=> [(10,8),(10,2),(8,3),(8,5),(2,2),(2,0)]