删除红黑树中的方法

时间:2013-05-05 10:58:22

标签: red-black-tree remove-method

我在RB树中的remove方法有问题。 x.parent=y.parent处有一个NullPointerException。问题肯定是x=null,如果我在方法DeleteFixUp中使用这个x,那么也存在NullPointerException。我在哪里有错?

Element delete(Element DeleteNode)   
 {

Element x=null;

Element y=null;

    if((DeleteNode.left==null)||(DeleteNode.right==null))
        y=DeleteNode;
    else 
        y=Succesor(DeleteNode,root);

    if (y.left != null)
        x=y.left;
    else 
        x=y.right;

    x.parent=y.parent;

    if (y.parent == null)
        root = x;
    else 
    if (y == y.parent.left)
        y.parent.left = x;
    else 
        y.parent.right = x;
    if (y != DeleteNode)
        DeleteNode.value = y.value;

    if(!isRed(y))
    { DeleteFixUp(x);}
    return y;
}

这是Successor方法:

 Element Succesor(Element x, Element root)

 {

    if( x.right != null )
    { x=FindMin(x.right);
        return x;
              }

    Element succ = null;

    while (root != null)
    {
        if (_comparator.compare(x.value,root.value)==-1)
        {
            succ = root;
            root = root.left;
        }
        else if ((_comparator.compare(x.value,root.value)==1))
            root = root.right;
        else
            break;
    }

    return succ;
} 
哎呀,我已经解决了这个问题,但我有另一个问题。 我添加到我的代码中:

Element delete(Element DeleteNode)   
 {

Element x=null;

Element y=null;

    if((DeleteNode.left==null)||(DeleteNode.right==null))
        y=DeleteNode;
    else 
        y=Succesor(DeleteNode,root);

    if (y.left != null)
        x=y.left;
    else 
        x=y.right;
    //added to code 
    if (x == null) 
    {x = new Element(null);              
     x.kolor=0;          
    }


    x.parent=y.parent;

    if (y.parent == null)
        root = x;
    else 
    if (y == y.parent.left)
        y.parent.left = x;
    else 
        y.parent.right = x;
    if (y != DeleteNode)
        DeleteNode.value = y.value;

    if(!isRed(y))
    { DeleteFixUp(x);}
    return y;
}

现在,我有一个问题,删除后如何删除此x.value=null

1 个答案:

答案 0 :(得分:0)

您要删除的节点可能没有任何子节点。在这种情况下,您没有要重新显示的子树。