java删除包含两个子节点的二叉树节点

时间:2012-12-07 00:45:22

标签: java

这是要删除的节点有两个子节点的最后一种情况。我无法弄清楚我做错了什么。请帮忙。

    //BTNode has two children
    else if (u.getLeft() != null && u.getRight() != null){
        //if node to delete is root
        BTNode<MyEntry<K,V>> pred = u.getRight();


        while (pred.getLeft().element() != null){
            pred = pred.getLeft();
        }


        BTNode<MyEntry<K,V>> predParent = pred.getParent();
        if (!hasRightChild(pred)){
            predParent.setLeft(new BTNode<MyEntry<K,V>>(null,predParent,null,null));}
        if (hasRightChild(pred)){
            BTNode<MyEntry<K,V>> predChild = pred.getRight();
            predParent.setLeft(predChild);
            predChild.setParent(predParent);
        }


        return returnValue;

好的,这样修改它?

        u.setElement(succ.element());



        BTNode<MyEntry<K,V>> succParent = succ.getParent();
        if (!hasLeftChild(succ)){
            succParent.setRight(new BTNode<MyEntry<K,V>>(null,succParent,null,null));}
        if (hasLeftChild(succ)){
            BTNode<MyEntry<K,V>> predChild = succ.getLeft();
            succParent.setRight(predChild);
            predChild.setParent(succParent);
        }


        return returnValue;

2 个答案:

答案 0 :(得分:1)

来自维基百科:

  

删除包含两个子节点的节点:调用要删除的节点N.执行   不删除N.而是选择其有序后继节点或   它的有序前导节点R.用N替换N的值   R的值,然后删除R.

因此,以左子项为例,然后在该子树中找到最右边的叶子,然后将要删除的节点的信息替换为叶子的信息,然后轻松删除该叶子。

您可能想要创建一个从子树返回最右边的叶子的函数。

答案 1 :(得分:0)

我已经给出了删除BST中节点的代码,该代码适用于任何条件,并且也使用for循环。

public void delete(int key) {

    Node<E> temp = find(key);
    System.out.println(temp.key);

    for (;;) {
        // case 1 : external node
        if (temp.isExternal()) {
            if (temp.getParent().getrChild() == temp) {
                temp.parent.rightchild = null;
                temp = null;
            } else {

                temp = null;
            }
            break;

        }

        // case2 : one child is null
        else if ((temp.getlChild() == null) || (temp.getrChild() == null)) {
            if ((temp.parent.leftchild != null) && temp.getParent().getlChild().key == temp.key) {
                if (temp.getlChild() == null) {
                    temp.getParent().setLeft(temp.getrChild());
                    temp.getrChild().setParent(temp.getParent());
                    break;

                }

                else
                    temp.getParent().setLeft(temp.getlChild());
                temp.getlChild().setParent(temp.getParent());
            }

            else {
                if (temp.rightchild != null) {
                    System.out.println("in");
                    temp.getParent().setRight(temp.getrChild());

                    temp.getrChild().setParent(temp.getParent());
                    break;

                }

                else
                    temp.getParent().setRight(temp.getlChild());
                temp.getlChild().setParent(temp.getParent());
            }

            break;
        }
        // case 3 : has both the children
        else {
            int t = temp.key;
            temp.key = temp.getlChild().key;
            temp.getlChild().key = t;
            temp = temp.getlChild();

            continue;
        }
    }

}