题目描述
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;
如果找到了,删除它。
样例描述
思路
BST的删除 + 分类讨论
- 三种情况如下:
- 对于第三种情况有两种方案:
①找到左子树的最右节点,让原来指向这个左子树最右节点的指针指向其左子树,然后用这个左子树最右节点替换掉目标节点
②方案二:找到右子树的最左节点,让原来指向这个右子树最左节点的指向指向其右子树,然后用这个右子树最左节点替换掉目标节点
两种方案替换后记得删除替换的那个结点。
代码
方案二:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
if (root == null) return null;
if (key > root.val) {
root.right = deleteNode(root.right, key);
}else if (key < root.val) {
root.left = deleteNode(root.left, key);
} else {
//左右子树都为空,就直接删除当前root结点 (赋值为空即可)
if (root.left == null && root.right == null) root = null;
else if (root.left == null && root.right != null) {
return root.right;
}else if (root.left != null && root.right == null) {
return root.left;
}else {
//查找右子树中最左的结点,替换掉根结点(值替换),然后再删除该结点
TreeNode node = root.right;
while (node.left != null) {
node = node.left;
}
root.val = node.val;
root.right = deleteNode(root.right, node.val);
}
}
return root;
}
}
方案一:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
if (root == null) {
return null;
}
if (key > root.val) {
root.right = deleteNode(root.right, key);
}else if (key < root.val) {
root.left = deleteNode(root.left, key);
} else {
if (root.left == null && root.right == null) {
root = null;
} else if (root.left == null && root.right != null) {
return root.right;
}else if (root.left != null && root.right == null) {
return root.left;
}else {
TreeNode node = root.left;
while (node.right != null) {
node = node.right;
}
root.val = node.val;
root.left = deleteNode(root.left, node.val);
}
}
return root;
}
}