1.4.3.4 RB Tree Delete Implementation

完整的原始碼點我

刪除的主要邏輯:

public boolean delete(int key) {
        // 1: Find the node you want to delete
        RbNode current = root;
        RbNode parent = root;

        // The substitution of the deleted node
        RbNode substitution = null;

        current = this.findOneNode(root, key);
        if (current == null) {
            return true;
        }
        parent = current.getParent();

        // 2: If the node has no child
        if ((current.getLeft() == null || isEmptyNode(current.getLeft()))
                && (current.getRight() == null || isEmptyNode(current.getRight()))) {
            hasNoChildren(parent, current, isLeft);
            if (!current.isRed()) {
                substitution = new RbNode(SUBSTITUTION_ID, SUBSTITUTION_DATA, false);
                substitution.setParent(current.getParent());

                if (parent != null) {
                    if (isLeft) {
                        parent.setLeft(substitution);
                    } else {
                        parent.setRight(substitution);
                    }
                }

            }
            current.setParent(null);
        }
        // 3: If the node has only one child
        // 3.1: Only has left child
        else if (current.getRight() == null || isEmptyNode(current.getRight())) {
            oneLeftChild(parent, current, isLeft);
            if (!current.isRed() && current.getLeft().isRed()) {
                current.getLeft().setRed(false);
            } else if (!current.isRed() && !current.getLeft().isRed()) {
                substitution = current.getLeft();
            }
        }
        // 3.2: Only has right child
        else if (current.getLeft() == null || isEmptyNode(current.getLeft())) {
            oneRightChild(parent, current, isLeft);
            if (!current.isRed() && current.getRight().isRed()) {
                current.getRight().setRed(false);
            } else {
                substitution = current.getRight();
            }
        }
        // 4: If the node has two child
        else {
            // 4.1: Find the in-order successor
            RbNode successor = getSuccessor(current);

            /*
             * 4.2: Swap the successor and current node without copying color and changing
             * relationship
             */
            RbNode tempNode = new RbNode(successor.getId(), successor.getData(), successor.isRed());
            successor.setId(current.getId());
            successor.setData(current.getData());

            current.setId(tempNode.getId());
            current.setData(tempNode.getData());

            // 4.3: Execute delete operation again
            delete(successor.getId());
        }

        // After the delete operation, execute balance operation
        if (substitution != null) {
            balanceAfterDelete(substitution);
        }

        return true;
    }

在刪除過程中搜尋節點:

刪除之後的平衡操作:

Last updated

Was this helpful?