二分搜索树节点删除学习笔记
概述
在二分搜索树中,我们可以通过比较节点中的值来进行查找、插入和删除操作。而节点删除操作是其中的一项关键操作,也是比较复杂的一种操作。
节点删除操作流程
删除一个二分搜索树中的节点,需要考虑该节点所在的位置以及其子节点的情况。删除一个节点后,需要将其子节点移动到正确的位置上,从而保持二分搜索树的性质。
具体步骤如下:
- 查找要删除的节点
- 删除节点并处理其子节点
对于第一步,我们可以使用递归或者循环的方式进行查找。如果找到了要删除的节点,就可以进入第二步操作。
对于第二步,我们需要对于要删除的节点进行分类处理:
- 如果要删除的节点没有子节点,直接删除该节点;
- 如果要删除的节点有一个子节点,将该子节点接到父节点的位置上;
- 如果要删除的节点有两个子节点,则找到其右子树的最小值节点来代替它,同时删除该最小值节点。
代码实现如下:
pythonCopy Codeclass BST:
# ...
def remove(self, val):
self.root = self._remove(self.root, val)
def _remove(self, node, val):
if not node:
return None
if val < node.val:
node.left = self._remove(node.left, val)
elif val > node.val:
node.right = self._remove(node.right, val)
else:
# 没有子节点,或只有一个子节点
if not node.left:
return node.right
if not node.right:
return node.left
# 有两个子节点,找到右子树的最小值节点
temp = self._min(node.right)
node.val = temp.val
node.right = self._remove(node.right, temp.val)
return node
def _min(self, node):
while node.left:
node = node.left
return node
实例演示
假设我们有以下二分搜索树:
Copy Code 5
/ \
3 8
/ \ / \
1 4 7 9
/
6
我们来进行删除操作:
- 删除节点 1:
Copy Code 5
/ \
3 8
\ / \
4 7 9
/
6
- 删除节点 8:
Copy Code 5
/ \
3 9
/ \ / \
1 4 7 6
- 删除节点 5:
Copy Code 4
/ \
3 9
/ / \
1 7 6
通过以上实例演示,可以看到我们成功地删除了二分搜索树中的节点,并保持了其性质。