我正在为所用的此类使用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
有效。我想这只能用一个功能来完成。
答案 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 right
,left
中的所有值都小于{{ 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 = ...
的情况下该怎么做。