Haskell树帮助

Haskell树帮助,haskell,Haskell,有人能帮我解答作业问题吗?我已经做了大部分,但我仍然停留在这三个问题上 问题是: 考虑以下类型的搜索树和平衡树 其施工人员受以下约束: 表单节点left n right的值必须使左侧的所有整数最多为n,且右侧的所有整数大于n 形式为分支左向右的值必须在左和右中的整数数之间存在差异,最多一个 a) 定义一个递归函数stree::[Int]->stree,该函数从整数列表构造搜索树 b) 定义一个递归函数btree::[Int]->btree,该函数从非空整数列表构造一个平衡树 c) 使用mer

有人能帮我解答作业问题吗?我已经做了大部分,但我仍然停留在这三个问题上

问题是:

考虑以下类型的搜索树和平衡树

其施工人员受以下约束:

  • 表单
    节点left n right
    的值必须使左侧的所有整数最多为
    n
    ,且右侧的所有整数大于
    n
  • 形式为
    分支左向右
    的值必须在
    中的整数数之间存在差异,最多一个
a) 定义一个递归函数
stree::[Int]->stree
,该函数从整数列表构造搜索树

b) 定义一个递归函数
btree::[Int]->btree
,该函数从非空整数列表构造一个平衡树

c) 使用merge,定义一个递归函数
collapse::BTree->[Int]
,该函数折叠一个平衡树以给出一个已排序的整数列表

请帮帮我


非常感谢

我不想享受所有的乐趣,但我要参加a部分

stree :: [Int] -> Stree
stree []     = Leaf
stree (x:xs) = let (left, right) = partition (<= x) xs
               in Stree (stree left) x (stree right)
stree=foldr插入叶
其中插入::Int->STree->STree

插入i(节点li'r)| i这些是递归数据结构。让我们从搜索树开始:

data STree = Leaf | Node STree Int STree
左侧的所有值必须小于父级,父级必须小于右侧的所有值。你能写下stree[]和stree[x]的答案吗?你能走多远

我将开始:

stree [] = Leaf
stree [x] = Node Leaf x Leaf
stree ([x,y]) = if x < y then Node Leaf x (Node Leaf y Leaf) else Node (Node Leaf y Leaf) x Leaf
这让生活变得更轻松:

stree [] = Leaf
stree [x] = singleton x
stree ([x,y]) = if x < y then Node Leaf x (singleton y) else Node (singleton y) x Leaf
stree[]=Leaf
stree[x]=单态x
stree([x,y])=如果x
但它并没有解决嵌套if的基本问题。列表的一个常见技巧是一次只取一个元素。这对我们有用吗

addToSTree :: Int -> STree -> STree
addToStree x Leaf = singleton x
addToStree x (Node left n right) | x < n = ...
                                 | otherwise = ...
addToSTree::Int->STree->STree
addToStree x叶=单例x
AddToTree x(节点左n右)| x
你能把上面的点填上吗?一旦你有了它,那么是时候对列表的内容进行循环了


B树也可以用同样的方法解决。

你的问题有两部分。首先,设计与二叉树相关的必要算法。第二,它们在Haskell中的实现。澄清你在这个问题上已经走了多远,以及你需要帮助的步骤。到目前为止你有什么?到“gbacon”:事实上,这部分有5个问题,但我已经做了2个,并且坚持上面的3个问题。其他两个问题是:“展平”和“合并”{展平问题-}展平::树->[Int]展平(叶n)=[n]展平(节点LnR)=展平l++[n]++展平r和{merge问题-}合并::[Int]->[Int]->[Int]合并[]xs=xs合并xs[]=xs合并(x:xs)(y:ys)=如果(XY您可以使用
partition
而不是
stree
中的
filter
的两个实例:
let(left,right)=分区(好主意,做了必要的修改。您还可以用split替换take and drop。(left,right)=splitAt len ys在分支中(btree left)(btree right)从问题陈述中,我非常确定您不需要对平衡树进行排序。至少您不需要在每个递归步骤中都进行排序,因为
ys
的子列表仍然会被排序!感谢这么多人,我想我现在可以对最后一个问题有一些想法了。
stree [] = Leaf
stree [x] = Node Leaf x Leaf
stree ([x,y]) = if x < y then Node Leaf x (Node Leaf y Leaf) else Node (Node Leaf y Leaf) x Leaf
singleton x = Node Leaf x Leaf
stree [] = Leaf
stree [x] = singleton x
stree ([x,y]) = if x < y then Node Leaf x (singleton y) else Node (singleton y) x Leaf
addToSTree :: Int -> STree -> STree
addToStree x Leaf = singleton x
addToStree x (Node left n right) | x < n = ...
                                 | otherwise = ...