设待删除节点为cur, 待删除节点的双亲节点为parent
情况一. cur.left == null
1当删除节点为根节点时,直接令删除节点的右节点right为新根节点
2若待删除节点cur不是根节点,而是parent的左节点, 就令cur的右节点为parent的左节点
3.若cur不是root, 是parent的右节点,则令parent的右节点为cur的右节点。
情况二:cur.right == null
1. cur 是 root, 则root = cur.left
2. cur 不是 root ,cur 是 parent.left, 则 parent.left = cur.left
3. cur 不是 root, cur 是 parent.right, 则 parent.right = cur.left
情况三. cur.left != null && cur.right != null
需要使用
替换法
进行删除,即在它的右子树中寻找中序下的第一个结点
(
关键码最小
)
,用它的值填补到被
删除节点中,再来处理该结点的删除问题
完整代码实现:
public void removeNode(int key) {
TreeNode cur = root;
TreeNode parent = null;
while(cur != null) {
if(cur.val < key) {
parent = cur;
cur = cur.left;
}else if(cur.val > key) {
parent = cur;
cur = cur.right;
}else {
remove(cur,parent);
return;
}
}
}
private void remove(TreeNode cur, TreeNode parent) {
if(cur.left == null) {
if(cur == root) {
root = cur.right;
}else if(cur == parent.left) {
parent.left = cur.right;
}else {
parent.right = cur.right;
}
}else if(cur.right == null) {
if(cur == root) {
root = cur.left;
}else if(cur == parent.left) {
parent.left = cur.left;
}else {
parent.right = cur.left;
}
}else {
TreeNode targetParent = cur;
TreeNode target = cur.right;
while(target.left != null) {
targetParent = target;
target = target.left;
}
if(target.left == null) {
cur.val = target.val;
cur.right = target.right;
}else {
cur.val = target.val;
targetParent.left = target.right;
}
}
}