插入二叉搜索树中(仅存储在叶节点中的数据)

时间:2019-05-18 17:26:46

标签: haskell recursion binary-search-tree

我正在为所用的此类使用Haskell,并且必须通过递归在二进制搜索树中插入。这是我的树定义:

  

数据树= Leaf Int |分支树树

一个例子是:

  

tree1 =分支((分支(叶子2)(叶子4))(分支(叶子6)(叶子10)))

我的插入函数应获取一棵树和一个整数并返回一棵树:

  

插入::树->整数->树

我只是不明白如何解决这个问题。

编辑: 我知道模式匹配。这就是我的想法。

insert :: Tree -> Int -> Tree
insert (Leaf i) j = if (i > j) than Branch (Leaf j) (Leaf i)
                    else Leaf i
insert (Branch l r) j = Branch (insert l j) (insert r j)

我知道这是错误的。如果有两个或多个大于j的值,它将获得多次插入的值。

edit2: 因此,我遵循@Willem Van Onsem的建议,并得到了以下提示:

infimum :: Tree -> Int

infimum (Leaf i) = i;
infimum (Branch l r) = infimum r

insert :: Tree -> Int -> Tree
insert (Leaf i) j = if (j > i) then Branch (Leaf i) (Leaf j)
                    else Branch (Leaf j) (Leaf i)
insert (Branch l r) j = if (j > (infimum l)) then Branch l (insert r j)
                        else Branch (insert l j) r

有效。我想这只能用一个功能来完成。

2 个答案:

答案 0 :(得分:3)

解决此问题所需的技术称为pattern matching,它与条件分支(如果/模式保护器)结合在一起。

您可以通过使用case语句或使用类似以下内容的替代函数定义来做到这一点:

maybeAddOne :: Maybe Int -> Maybe Int
maybeAddOne Nothing = Nothing
maybeAddOne (Just a) 
  | a < 5 = Just (a + 1)
  | otherwise = Just a

答案 1 :(得分:3)

鉴于您当前的类型,您没有依据来确定要将新值插入哪个子树;在您到达一片叶子之前,您没有任何可比较的值。

从适当的搜索树开始:

data BST = Node Int BST BST | Empty

每个节点都包含一个值,并且您的insert函数必须保留search属性,该属性指出对于给定的节点Node x left rightleft中的所有值都小于{{ 1}},并且x中的所有值都大于right。 (如果您尝试插入x,则无需执行任何操作:键是唯一的。)

x

我将其作为练习来确定在insert :: BST -> Int -> BST insert Empty x = Node x Empty Empty -- replace the empty tree with a single leaf insert t@(Node y left right) | x == y = t -- do nothing | x < y = ... | otherwise = ... 的情况下该怎么做。