Haskell中的二进制搜索树函数

时间:2013-06-08 14:07:37

标签: haskell insert merge tree binary-search-tree

我需要帮助完成3项任务。我是Haskell和函数式编程的新手。

data Tree = Node Int Tree Tree | Nil
  1.   

    借助函数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。在这里你可以看到中间的所有值都被排序,但我不知道我应该如何编码。

  2.   

    定义一个Haskell-Function insert :: Int -> Tree -> Tree,它将整数值添加到树中,并返回一个二叉搜索树。

  3.   

    使用函数insert(2)定义一个Haskell-Function merge :: Tree -> Tree -> Tree,它将两棵树合并到另一个二叉搜索树。

1 个答案:

答案 0 :(得分:5)

好吧,我不会回答所有这些问题,但我可以提供一些帮助。

  1. 如果我们在看起来像这样的树上尝试collapse

              a
             / \
            /   \             
           b     c
          / \   / \
         d   e f   g
    

    我们得到[d, b, e, a, f, c, g]。请注意,如果元素出现在树中元素的“左侧”,则它位于我们的平面列表中该元素的“左侧”。我们知道,如果元素a位于元素左侧c,则在二叉搜索树中,a< c。因此,我们只需检查此属性是否适用于我们的列表。

  2. 在树中插入元素。我们有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。你可以直接翻译二叉搜索树的定义来填补这里的漏洞。

  3. 由于我们没有尝试使用平衡二叉树,如果我们有2棵树,AB。我们所要做的就是找到插入B根的位置,并将整棵树粘在那里。