src/main/java/com/workplacesystems/utilsj/collections/TransactionalBidiTreeMap.java
private void swapPosition(final Node<K,V> x, final Node<K,V> y, final int index) {

        // Save initial values.
        Node<K,V>    xFormerParent     = x.getParent(index);
        Node<K,V>    xFormerLeftChild  = x.getLeft(index);
        Node<K,V>    xFormerRightChild = x.getRight(index);
        Node<K,V>    yFormerParent     = y.getParent(index);
        Node<K,V>    yFormerLeftChild  = y.getLeft(index);
        Node<K,V>    yFormerRightChild = y.getRight(index);
        boolean xWasLeftChild     =
            (x.getParent(index) != null)
            && (x == x.getParent(index).getLeft(index));
        boolean yWasLeftChild     =
            (y.getParent(index) != null)
            && (y == y.getParent(index).getLeft(index));

        // Swap, handling special cases of one being the other's parent.
        if (x == yFormerParent) {    // x was y's parent
            x.setParent(y, index);

            if (yWasLeftChild) {
                y.setLeft(x, index);
                y.setRight(xFormerRightChild, index);
            } else {
                y.setRight(x, index);
                y.setLeft(xFormerLeftChild, index);
            }
        } else {
            x.setParent(yFormerParent, index);

            if (yFormerParent != null) {
                if (yWasLeftChild) {
                    yFormerParent.setLeft(x, index);
                } else {
                    yFormerParent.setRight(x, index);
                }
            }

            y.setLeft(xFormerLeftChild, index);
            y.setRight(xFormerRightChild, index);
        }

        if (y == xFormerParent) {    // y was x's parent
            y.setParent(x, index);

            if (xWasLeftChild) {
                x.setLeft(y, index);
                x.setRight(yFormerRightChild, index);
            } else {
                x.setRight(y, index);
                x.setLeft(yFormerLeftChild, index);
            }
        } else {
            y.setParent(xFormerParent, index);

            if (xFormerParent != null) {
                if (xWasLeftChild) {
                    xFormerParent.setLeft(y, index);
                } else {
                    xFormerParent.setRight(y, index);
                }
            }

            x.setLeft(yFormerLeftChild, index);
            x.setRight(yFormerRightChild, index);
        }

        // Fix children's parent pointers
        if (x.getLeft(index) != null) {
            x.getLeft(index).setParent(x, index);
        }

        if (x.getRight(index) != null) {
            x.getRight(index).setParent(x, index);
        }

        if (y.getLeft(index) != null) {
            y.getLeft(index).setParent(y, index);
        }

        if (y.getRight(index) != null) {
            y.getRight(index).setParent(y, index);
        }

        x.swapColors(y, index);

        // Check if root changed
        if (rootNode[index] == x) {
            rootNode[index] = y;
        } else if (rootNode[index] == y) {
            rootNode[index] = x;
        }
    }
private void swapPosition(final Node<K,V> x, final Node<K,V> y, final int index) {

        // Save initial values.
        Node<K,V>    xFormerParent     = x.getParent(index);
        Node<K,V>    xFormerLeftChild  = x.getLeft(index);
        Node<K,V>    xFormerRightChild = x.getRight(index);
        Node<K,V>    yFormerParent     = y.getParent(index);
        Node<K,V>    yFormerLeftChild  = y.getLeft(index);
        Node<K,V>    yFormerRightChild = y.getRight(index);
        boolean xWasLeftChild     =
            (x.getParent(index) != null)
            && (x == x.getParent(index).getLeft(index));
        boolean yWasLeftChild     =
            (y.getParent(index) != null)
            && (y == y.getParent(index).getLeft(index));

        // Swap, handling special cases of one being the other's parent.
        if (x == yFormerParent) {    // x was y's parent
            x.setParent(y, index);

            if (yWasLeftChild) {
                y.setLeft(x, index);
                y.setRight(xFormerRightChild, index);
            } else {
                y.setRight(x, index);
                y.setLeft(xFormerLeftChild, index);
            }
        } else {
            x.setParent(yFormerParent, index);

            if (yFormerParent != null) {
                if (yWasLeftChild) {
                    yFormerParent.setLeft(x, index);
                } else {
                    yFormerParent.setRight(x, index);
                }
            }

            y.setLeft(xFormerLeftChild, index);
            y.setRight(xFormerRightChild, index);
        }

        if (y == xFormerParent) {    // y was x's parent
            y.setParent(x, index);

            if (xWasLeftChild) {
                x.setLeft(y, index);
                x.setRight(yFormerRightChild, index);
            } else {
                x.setRight(y, index);
                x.setLeft(yFormerLeftChild, index);
            }
        } else {
            y.setParent(xFormerParent, index);

            if (xFormerParent != null) {
                if (xWasLeftChild) {
                    xFormerParent.setLeft(y, index);
                } else {
                    xFormerParent.setRight(y, index);
                }
            }

            x.setLeft(yFormerLeftChild, index);
            x.setRight(yFormerRightChild, index);
        }

        // Fix children's parent pointers
        if (x.getLeft(index) != null) {
            x.getLeft(index).setParent(x, index);
        }

        if (x.getRight(index) != null) {
            x.getRight(index).setParent(x, index);
        }

        if (y.getLeft(index) != null) {
            y.getLeft(index).setParent(y, index);
        }

        if (y.getRight(index) != null) {
            y.getRight(index).setParent(y, index);
        }

        x.swapColors(y, index);

        // Check if root changed
        if (rootNode[index] == x) {
            rootNode[index] = y;
        } else if (rootNode[index] == y) {
            rootNode[index] = x;
        }
    }
private void swapPosition ( final Node < K , V > x , final Node < K , V > y , final int index ) { // Save initial values.
 Node < K , V > xFormerParent = x . getParent ( index ) ; Node < K , V > xFormerLeftChild = x . getLeft ( index ) ; Node < K , V > xFormerRightChild = x . getRight ( index ) ; Node < K , V > yFormerParent = y . getParent ( index ) ; Node < K , V > yFormerLeftChild = y . getLeft ( index ) ; Node < K , V > yFormerRightChild = y . getRight ( index ) ; boolean xWasLeftChild = ( x . getParent ( index ) != null ) && ( x == x . getParent ( index ) . getLeft ( index ) ) ; boolean yWasLeftChild = ( y . getParent ( index ) != null ) && ( y == y . getParent ( index ) . getLeft ( index ) ) ; // Swap, handling special cases of one being the other's parent.
 if ( x == yFormerParent ) { // x was y's parent
 x . setParent ( y , index ) ; if ( yWasLeftChild ) { y . setLeft ( x , index ) ; y . setRight ( xFormerRightChild , index ) ; } else { y . setRight ( x , index ) ; y . setLeft ( xFormerLeftChild , index ) ; } } else { x . setParent ( yFormerParent , index ) ; if ( yFormerParent != null ) { if ( yWasLeftChild ) { yFormerParent . setLeft ( x , index ) ; } else { yFormerParent . setRight ( x , index ) ; } } y . setLeft ( xFormerLeftChild , index ) ; y . setRight ( xFormerRightChild , index ) ; } if ( y == xFormerParent ) { // y was x's parent
 y . setParent ( x , index ) ; if ( xWasLeftChild ) { x . setLeft ( y , index ) ; x . setRight ( yFormerRightChild , index ) ; } else { x . setRight ( y , index ) ; x . setLeft ( yFormerLeftChild , index ) ; } } else { y . setParent ( xFormerParent , index ) ; if ( xFormerParent != null ) { if ( xWasLeftChild ) { xFormerParent . setLeft ( y , index ) ; } else { xFormerParent . setRight ( y , index ) ; } } x . setLeft ( yFormerLeftChild , index ) ; x . setRight ( yFormerRightChild , index ) ; } // Fix children's parent pointers
 if ( x . getLeft ( index ) != null ) { x . getLeft ( index ) . setParent ( x , index ) ; } if ( x . getRight ( index ) != null ) { x . getRight ( index ) . setParent ( x , index ) ; } if ( y . getLeft ( index ) != null ) { y . getLeft ( index ) . setParent ( y , index ) ; } if ( y . getRight ( index ) != null ) { y . getRight ( index ) . setParent ( y , index ) ; } x . swapColors ( y , index ) ; // Check if root changed
 if ( rootNode [ index ] == x ) { rootNode [ index ] = y ; } else if ( rootNode [ index ] == y ) { rootNode [ index ] = x ; } }
swap two nodes (except for their content), taking care of
special cases where one is the other's parent ... hey, it
happens.

@param x one node
@param y another node
@param index KEY or VALUE
swap two nodes ( except for their content ) taking care of special cases where one is the other s parent ... hey it happens .