Haskell树的帮助

时间:2010-08-17 03:21:42

标签: haskell

有人可以帮我解决我的作业问题吗?我已经完成了大部分工作,但我仍然坚持这3个问题。

以下是问题:

  

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

data STree = Leaf | Node STree Int STree  
data Btree = Tip Int | Branch Btree Btree
     

其构造函数受以下约束条件限制:

     
      
  • 表单Node left n right的值必须包含左侧的所有整数n且右侧的所有整数都大于n
  •   
  • Branch left right形式的值必须在leftright中最多只有一个的整数数之间存在差异。
  •   
     

a)定义一个递归函数stree :: [Int] -> STree,它从整数列表构造一个搜索树。

     

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

     

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

请帮帮我!!!

非常感谢!

3 个答案:

答案 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可以类似地解决。