思路一:
先遍历树 如果当前节点不是要删除的节点则把当前节点返回给上一个节点 或者 遍历到空节点也返回给上一个节点
如果当前节点是要删除的节点 分几种情况
1. 如果被删除的节点 左子节点为空 就返回 右子节点 给前一个节点
2. 如果被删除的节点 右子节点为空 就返回 左子节点 给前一个节点
3. 如果左右子节点都不为空 就找到当前节点的 右子节点 迭代到他的最左下的子节点 把最左下的子节点赋值给被删除的节点 再把最左下的节点删除
删除最左下也有两种方法
a. 继续使用 上述的方法 递归寻找
b. 直接让它的子节点指向它的 上一个节点
代码如下:
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
root = delete(root,key);
return root;
}
private TreeNode delete(TreeNode root, int key) {
if (root == null) return null;
if (root.val > key) {
root.left = delete(root.left,key);
} else if (root.val < key) {
root.right = delete(root.right,key);
} else {
if (root.left == null) return root.right;
if (root.right == null) return root.left;
TreeNode tmp = root.right;
while (tmp.left != null) {
tmp = tmp.left;
}
root.val = tmp.val;
root.right = delete(root.right,tmp.val);
}
return root;
}
}
或者:
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
root = delete(root,key);
return root;
}
private TreeNode delete(TreeNode root, int key) {
if (root == null) return null;
if (root.val > key) {
root.left = delete(root.left,key);
} else if (root.val < key) {
root.right = delete(root.right,key);
} else {
if (root.left == null) return root.right;
if (root.right == null) return root.left;
TreeNode tmp = root.right;
TreeNode pre = root.right.left;
while (tmp.left != null) {
if(tmp.left.left == null){
pre = tmp;
}
tmp = tmp.left;
}
root.val = tmp.val;
if(pre == null){
root.right =root.right.right;
}else{
pre.left = tmp.right;
}
}
return root;
}
}
思路二:
找到删除的节点 将他的右子节点 返回给它的上一个节点 再把他的左子节点指向 他最左下节点 最后把 它的左子节点设为空
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
if (root == null) return root;
if (root.val == key) {
if (root.left == null) {
return root.right;
} else if (root.right == null) {
return root.left;
} else {
TreeNode cur = root.right;
while (cur.left != null) {
cur = cur.left;
}
cur.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;
}
}