我需要帮助完成3项任务。我是Haskell和函数式编程的新手。
data Tree = Node Int Tree Tree | Nil
借助函数
进行定义collapse
collapse :: Tree -> [Int] collapse Nil = [] collapse (Node x y z) = (collapse y) ++ [x] ++ (collapse z)
一个Haskell-Function
check :: Tree -> Bool
,用于检查Tree是否为二叉搜索树。
我用树测试并得到2 4 7 8 10 | 5 6 10 12
。在这里你可以看到中间的所有值都被排序,但我不知道我应该如何编码。
定义一个Haskell-Function
insert :: Int -> Tree -> Tree
,它将整数值添加到树中,并返回一个二叉搜索树。
使用函数
insert
(2)定义一个Haskell-Functionmerge :: Tree -> Tree -> Tree
,它将两棵树合并到另一个二叉搜索树。
答案 0 :(得分:5)
好吧,我不会回答所有这些问题,但我可以提供一些帮助。
如果我们在看起来像这样的树上尝试collapse
a
/ \
/ \
b c
/ \ / \
d e f g
我们得到[d, b, e, a, f, c, g]
。请注意,如果元素出现在树中元素的“左侧”,则它位于我们的平面列表中该元素的“左侧”。我们知道,如果元素a
位于元素左侧c
,则在二叉搜索树中,a
< c
。因此,我们只需检查此属性是否适用于我们的列表。
在树中插入元素。我们有4个案件要处理
insert newVal (Node treeVal left right) | newVal < treeVal = <1>
| newVal > treeVal = <2>
| otherwise = <3>
insert newVal Nil = <4>
其中&lt; 1&gt;插入节点的值大于节点中的值。 &LT 2 - ;相反:节点的值大于新值。在3中它们是相等的,在4中我们插入基础案例Nil
。你可以直接翻译二叉搜索树的定义来填补这里的漏洞。
由于我们没有尝试使用平衡二叉树,如果我们有2棵树,A
和B
。我们所要做的就是找到插入B
根的位置,并将整棵树粘在那里。