叶子和节点中具有值的二叉树由以下内容定义:
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)
答案 0 :(得分:3)
你想使用Data.Tree
,但Data.Tree
甚至不是关于二叉树,而是关于多路树(a.k.a。玫瑰树)。但是,如果你有一个函数value :: Tree a -> a
,那么当然你可以将它映射到玫瑰树的子节点并将结果与值组合。
现在,存在一个在Data.Tree
中执行该功能的功能,它被称为rootLabel
。并且还有另一个功能来确定节点的子节点,它被称为subForest
。
来自Tree
中Data.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)]