红黑树删除方法

    //删除一个节点
        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;
        }

posted @ 2020-09-25 21:27  蓝冰nine  阅读(178)  评论(0)    收藏  举报