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

Haskell 在二元搜索树中插入(数据仅存储在叶节点),haskell,recursion,binary-search-tree,Haskell,Recursion,Binary Search Tree,我正在使用Haskell来处理我所处的这个类,我必须用递归在二叉搜索树中插入。以下是我的树定义: 数据树=叶Int |分支树 例如: tree1=树枝((树枝(叶2)(叶4))(树枝(叶6)(叶10))) 我的insert函数应该得到一棵树和一个Int并返回一棵树: 插入::Tree->Int->Tree 我就是不明白如何处理这个问题 编辑: 我知道模式匹配。以下是我的想法 insert::Tree->Int->Tree 插入(叶i)j=如果(i>j)大于分支(叶j)(叶i) 否则叶我 插入(分

我正在使用Haskell来处理我所处的这个类,我必须用递归在二叉搜索树中插入。以下是我的树定义:

数据树=叶Int |分支树

例如:

tree1=树枝((树枝(叶2)(叶4))(树枝(叶6)(叶10)))

我的insert函数应该得到一棵树和一个Int并返回一棵树:

插入::Tree->Int->Tree

我就是不明白如何处理这个问题

编辑: 我知道模式匹配。以下是我的想法

insert::Tree->Int->Tree
插入(叶i)j=如果(i>j)大于分支(叶j)(叶i)
否则叶我
插入(分支l r)j=分支(插入l j)(插入r j)
我知道这是错误的。如果有两个或多个大于j的数字,它会多次插入值

编辑2: 所以我按照@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

它起作用了。我想这不能只用一个函数来完成。

解决这个问题所需的技术称为结合条件分支(if/pattern)

您可以通过使用
case
语句或通过如下方式定义替代函数定义来实现:

maybeAddOne :: Maybe Int -> Maybe Int
maybeAddOne Nothing = Nothing
maybeAddOne (Just a) 
  | a < 5 = Just (a + 1)
  | otherwise = Just a
maybeAddOne::maybeint->maybeint
可能一无所有=一无所有
maybeAddOne(仅一个)
|a<5=刚好(a+1)
|否则=只是一个

给定当前类型,您没有依据决定将新值插入到哪个子树中;在到达叶子之前,您没有任何可比较的值

从正确的搜索树开始:

data BST = Node Int BST BST | Empty
每个节点都包含一个值,
insert
函数必须维护search属性,该属性表示对于给定节点
node x left right
left
中的所有值都小于
x
,而
right
中的所有值都大于
x
。(如果您尝试在已存在
x
时插入它,则无需执行任何操作:键是唯一的。)

insert::BST->Int->BST
insert Empty x=Node x Empty Empty--将空树替换为单个叶
插入t@(节点y左-右)| x==y=t--什么都不做
|x

我把它作为一个练习,以确定在以下情况下该怎么做:
x/=y

什么与您的尝试不起作用?您实际上没有提出任何问题,这使我相信隐含的问题是“为我编写代码”。请编辑您的问题以显示尝试和/或特定问题。同时,您不能使用该定义构建二叉搜索树;这只是对列表的一种低效编码,因为没有依据来决定从任何特定的内部节点执行哪个分支。二元搜索树是一种树,其属性是每个节点都包含一个唯一的值,并且给定节点
X
的左(右)子树中的所有值都更小(更大)比
X
@amalloy处的值低:您可以向下移动树,例如,取左子树最右边的节点来查找右子树的最大值,如果树是平衡的(我们可以平衡树),那么我们可以在O(log n)中检测,基于该值,我们搜索左子树或右子树,每一步我们都会再次执行相同的操作来检测“spit值”。我已经编辑了我的问题。我已经搜索了一点,但是存储有价值的东西的叶子使得很难找到任何相关的东西。这甚至不是家庭作业,只是练习。我被卡住了,我似乎无法理解解决这个问题的思维过程。您的问题中给出了树数据类型定义吗?如果不是这样的话,如果您不仅将值存储在树的叶子中,而且还存储在内部节点中,您可能会有一个更轻松的时间。类似于
data Tree=Node Int Tree Tree | Leaf
@契普纳人对这个问题的评论在这里也非常相关。是的,是的。之前的练习是关于树定义的,我已经设法完成了。我的问题是从只需要在叶子中存储值开始的。首先,感谢您抽出时间。我同意您的树定义会更好,但这是练习的一部分,值只能存储在叶中。实际上,之前的练习是使用节点中存储的值。
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 = ...