在二进制搜索树中添加一个叶子,Haskell

时间:2012-03-08 17:28:53

标签: haskell binary-tree

类型定义为

data BST = MakeNode BST String BST
          | Empty

我正在尝试向树中添加一个新的叶子,但我真的不明白如何使用递归。

该功能设置如下

add :: String -> BST -> BST

2 个答案:

答案 0 :(得分:2)

使用二叉树的优点是您只需要查看树的“当前部分”即可知道插入节点的位置。

所以,让我们定义add函数:

add :: String -> BST -> BST

如果您在空树中插入内容(案例#1),则只需直接创建一个叶子:

add s Empty = MakeNode Empty s Empty

如果要在节点中插入内容(案例#2),则必须决定将值插入哪个子节点。使用比较来执行此测试:

add s t@(MakeNode l p r) -- left, pivot, right
  | s > p     = Node l p (add s r) -- Insert into right subtree
  | s < p     = Node (add s l) p r -- Insert into left subtree
  | otherwise = t -- The tree already contains the value, so just return it

请注意,这不会重新平衡二叉树。二叉树重新平衡算法可能非常复杂,需要大量代码。因此,如果您将排序列表插入二叉树(例如["a", "b", "c", "d"]),它将变得非常不平衡,但这种情况在实践中非常罕见。

答案 1 :(得分:-1)

将您的数据重新定义为(我使用Int作为数据类型,但替换为任何内容)

data BST = Node BST Int BST | Leaf

然后你可以有一个像这样的插入函数(我不允许重复这个!):

insert :: Int -> BST -> BST
insert n (Leaf _) = Node Leaf n Leaf
insert n (Node lt x rt)
  | n > x     = Node lt x (insert n rt)
  | n < x     = Node (insert n lt) x rt
  | otherwise = Node lt x rt