二叉排序树的删除
时间: 2023-08-21 12:11:07 浏览: 346
二叉排序树的删除操作相对比较复杂,需要考虑多种情况。以下是具体步骤:
1. 找到要删除的节点,如果不存在,则删除操作失败,直接返回。
2. 如果要删除的节点没有左右子树,则直接删除该节点。
3. 如果要删除的节点只有左子树或右子树,则用左子树或右子树替代该节点。
4. 如果要删除的节点既有左子树又有右子树,则需要找到该节点的中序遍历的前驱或后继节点来替代该节点,再删除前驱或后继节点。
5. 如果要删除的节点的前驱或后继节点有右子树,则需要用右子树来替代前驱或后继节点。
下面是一个示例代码:
```java
public TreeNode deleteNode(TreeNode root, int key) {
if (root == null) {
return null;
}
if (key < root.val) {
root.left = deleteNode(root.left, key);
} else if (key > root.val) {
root.right = deleteNode(root.right, key);
} else {
if (root.left == null && root.right == null) {
root = null;
} else if (root.left == null) {
root = root.right;
} else if (root.right == null) {
root = root.left;
} else {
TreeNode successor = getSuccessor(root);
root.val = successor.val;
root.right = deleteNode(root.right, successor.val);
}
}
return root;
}
private TreeNode getSuccessor(TreeNode node) {
TreeNode curr = node.right;
while (curr != null && curr.left != null) {
curr = curr.left;
}
return curr;
}
```
其中,getSuccessor 方法用于获取要删除的节点的后继节点,即右子树中最小的节点。如果要获取前驱节点,只需要将 getSuccessor 方法中的右子树改为左子树即可。
阅读全文