类型定义为
data BST = MakeNode BST String BST
| Empty
我正在尝试向树中添加一个新的叶子,但我真的不明白如何使用递归。
该功能设置如下
add :: String -> BST -> BST
答案 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