有人可以帮我解决我的作业问题吗?我已经完成了大部分工作,但我仍然坚持这3个问题。
以下是问题:
考虑以下类型的搜索树和平衡树
data STree = Leaf | Node STree Int STree data Btree = Tip Int | Branch Btree Btree
其构造函数受以下约束条件限制:
- 表单
Node left n right
的值必须包含左侧的所有整数n
且右侧的所有整数都大于n
。Branch left right
形式的值必须在left
和right
中最多只有一个的整数数之间存在差异。a)定义一个递归函数
stree :: [Int] -> STree
,它从整数列表构造一个搜索树。b)定义一个递归函数
btree :: [Int] -> BTree
,它从一个非空的整数列表构造一个平衡树。c)使用merge,定义一个递归函数
collapse :: BTree -> [Int]
,它折叠一个平衡树,给出一个整数的排序列表。
请帮帮我!!!
非常感谢!
答案 0 :(得分:2)
不想带走所有的乐趣,但这是我的第一部分。
stree :: [Int] -> Stree
stree [] = Leaf
stree (x:xs) = let (left, right) = partition (<= x) xs
in Stree (stree left) x (stree right)
它只需要左右两侧的组件,并递归地为每个组件构建子树。
假设使用sort是合法的,那么我很确定这适用于b部分。
btree :: [Int] -> Btree
btree (x:[]) = Tip x
btree xs = let len = length xs `div` 2
ys = sort xs
in Branch (btree (take len ys)) (btree (drop len ys))
答案 1 :(得分:0)
stree = foldr insert Leaf
where insert :: Int -> STree -> STree
insert i (Node l i' r) | i <= i' = Node (insert i l) i' r
| otherwise = Node l i' (insert i r)
insert i (Leaf) = Node Leaf i Leaf
这不是一个非常有效的解决方案,它也不会产生非常平衡的树,但它是如何在Haskell中迭代构建数据结构的一个很好的例子。使用foldr
为我们处理迭代,我们一次将一个元素插入树中,将新树传递给构建下一个树的函数。我们穿过树,直到找到一片叶子,并用Leaf
替换Node
以保持给定的值。
答案 2 :(得分:0)
这些是递归数据结构。让我们从搜索树开始:
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
那种嵌套的if和节点构造会变得非常快。我们可以分解哪些常见的子表达式?
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
但它不会攻击嵌套if的基本问题。列表的一个常见技巧是一次一个元素。这对我们有用吗?
addToSTree :: Int -> STree -> STree
addToStree x Leaf = singleton x
addToStree x (Node left n right) | x < n = ...
| otherwise = ...
你能填写上面的圆点吗?一旦你有了,那么现在是时候对列表的内容进行循环了。
BTree可以类似地解决。