二叉排序树采用二叉链表存储。编写算法,删除结点值是 X 的结点,要求删除该 结点后,此树仍然是一棵二叉排序树,并且高度没有增长(可不考虑被删除的结点是根的情
时间: 2024-10-09 16:03:08 浏览: 21
Python二叉搜索树与双向链表转换算法示例
在二叉排序树(BST)中删除节点X通常需要分三种情况处理,因为我们需要保持树的有序性和删除后高度不变:
1. 被删节点是叶子节点:直接删除即可,无需调整。
2. 被删节点只有一个子节点:将这个子节点替换到被删节点的位置,然后删除原子节点。
3. 被删节点有两个子节点:找到被删节点右子树中的最小节点(左子树的最大节点),将其值替换到被删节点,然后在原右子树中删除这个最小节点。
以下是基本的递归算法步骤:
```python
def delete_node(root, x):
if root is None:
return root
# 如果x小于当前节点,向下搜索左子树
elif x < root.val:
root.left = delete_node(root.left, x)
# 如果x大于当前节点,向下搜索右子树
elif x > root.val:
root.right = delete_node(root.right, x)
# 找到了目标节点,现在有三个子节点的情况
else:
# 找到右子树的最小值
min_val = get_min_value(root.right)
# 将最小值替换到当前节点
root.val = min_val
# 删除右子树的最小值
root.right = delete_node(root.right, min_val)
# 返回结果
return root
# 辅助函数:获取右子树中的最小值
def get_min_value(node):
while node.left is not None:
node = node.left
return node.val
```
阅读全文