//删除一个节点
public Node deletevalue(Node p) {
//左右都有儿子找右儿子的最左叶字节点
if(p.left!=null&p.right!=null) {
Node s = successor(p);
p.value=s.value;
p=s;
}
Node replacement = p.left==null?p.right:p.left;
//有左儿子或者右儿子
if(replacement!=null) {
replacement.parent = p.parent;
if(p.parent==null) {
root =replacement;
}else if(p == p.parent.left) {
p.parent.left=replacement;
}else {
p.parent.right=replacement;
}
p.left=p.parent=p.right=null;
if(p.color==Black)
colorChange(replacement);
//本身是根节点
}else if(p.parent==null) {
root =null;
//本身是叶字节点
}else {
if(p.color==Black) {
colorChange(p);
}
if(p==p.parent.left)
p.parent.left=null;
else {
p.parent.right=null;
}
p.parent=null;
}
return p;
}
![]()