给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
- 首先找到需要删除的节点;
- 如果找到了,删除它。
public TreeNode deleteNode(TreeNode root, int key) {
if (root == null) return root;
//找到了删除结点
if (root.val == key) {
//1.该结点左子树为空,右子树直接补上
if (root.left == null) {
return root.right;
} else if (root.right == null) { //2.右子树为空,左子树补上
return root.left;
} else {
//3.左右子树都不为空
TreeNode newNode = root.right;
while (newNode.left != null) { //找到右子树的最左边结点
newNode = newNode.left;
}
newNode.left = root.left; //将要删除节点的左子树放在上述右子树的最左边结点上
root = root.right; //用右子树补上删除结点的位置
return root;
}
}
if (root.val > key) root.left = deleteNode(root.left, key);
if (root.val < key) root.right = deleteNode(root.right, key);
return root;
}