【问题标题】:Binary Search Tree Functions in HaskellHaskell 中的二叉搜索树函数
【发布时间】:2013-06-04 17:13:09
【问题描述】:

我需要 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 函数 check :: Tree -> Bool 检查树是否是二叉搜索树。

    我用一棵树测试它并得到2 4 7 8 10 | 5 6 10 12。在这里您可以看到中间的所有值都已排序,但我不知道我应该如何编码。

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

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

【问题讨论】:

  • collapse 是有序遍历。二叉树的中序遍历特性是二叉搜索树的特征?
  • 二叉树的左节点值(int)小于父节点,右节点值大于父节点和每个子节点的值。
  • 二叉树是二叉搜索树当且仅当它的中序遍历是...?
  • ...严格增加:)

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


【解决方案1】:

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

  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>
    

    其中 插入到节点中,其值大于节点中的值。 则相反:节点的值大于新值。在 3 中它们是相等的,在 4 中我们插入到基本情况 Nil。您几乎可以直接翻译二叉搜索树的定义来填补这里的漏洞。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多