python二叉树的删除
时间: 2025-05-24 14:18:52 浏览: 4
### Python 中二叉树节点删除操作的实现
在 Python 中实现二叉树节点的删除是一个复杂的过程,因为需要考虑多种情况。以下是详细的说明以及代码实现。
#### 删除节点的操作逻辑
当从二叉搜索树中删除一个节点时,有三种主要的情况需要处理:
1. **被删除节点是叶节点**:如果该节点既没有左子节点也没有右子节点,则可以直接将其设置为 `None`。
2. **被删除节点有一个子节点**:在这种情况下,可以用其唯一的子节点替换它。
3. **被删除节点有两个子节点**:这是最复杂的场景之一。通常的做法是从右侧子树找到最小值(或者左侧子树的最大值),并用这个值替代当前节点的值[^1]。
下面是完整的代码实现:
```python
class Node:
def __init__(self, value: int = 0):
self.val = value
self.left = None
self.right = None
class BinarySearchTree:
def __init__(self):
self.root = None
# 插入节点函数 (辅助理解结构)
def insert(self, root, key):
if not root:
return Node(key)
if key < root.val:
root.left = self.insert(root.left, key)
elif key > root.val:
root.right = self.insert(root.right, key)
return root
# 找到最小值的节点
def find_min(self, node):
current = node
while current and current.left is not None:
current = current.left
return current
# 删除节点的核心方法
def delete_node(self, root, key):
if not root:
return root
# 如果键小于根节点的值,则移动到左子树
if key < root.val:
root.left = self.delete_node(root.left, key)
# 如果键大于根节点的值,则移动到右子树
elif key > root.val:
root.right = self.delete_node(root.right, key)
# 当前节点就是要删除的目标
else:
# 叶子节点或仅有一个子节点的情况
if root.left is None:
temp = root.right
del root
return temp
elif root.right is None:
temp = root.left
del root
return temp
# 具有两个子节点的情况
min_larger_node = self.find_min(root.right) # 寻找右子树中的最小值
root.val = min_larger_node.val # 替换当前节点的值
root.right = self.delete_node(root.right, min_larger_node.val) # 删除右子树中的最小值节点
return root
```
以上代码实现了二叉搜索树中节点的删除功能,并涵盖了所有可能的情形[^2]。
---
### 示例运行流程
假设有一棵如下所示的二叉搜索树:
```
50
/ \
30 70
/ \ / \
20 40 60 80
```
执行以下命令可以测试删除操作的效果:
```python
bst = BinarySearchTree()
root = bst.insert(None, 50)
for val in [30, 70, 20, 40, 60, 80]:
bst.insert(root, val)
# 测试删除不同类型的节点
print("Before deletion:")
def inorder_traversal(node):
if node:
inorder_traversal(node.left)
print(node.val, end=" ")
inorder_traversal(node.right)
inorder_traversal(root)
print("\n")
# 删除具有两个子节点的节点
root = bst.delete_node(root, 50)
print("After deleting 50:", end=" ")
inorder_traversal(root)
print()
# 删除叶节点
root = bst.delete_node(root, 20)
print("After deleting 20:", end=" ")
inorder_traversal(root)
print()
# 删除单个子节点的节点
root = bst.delete_node(root, 70)
print("After deleting 70:", end=" ")
inorder_traversal(root)
print()
```
输出结果应显示每次删除后的顺序遍历序列变化。
---
阅读全文
相关推荐

















