Ejemplo n.º 1
0
            /** From CLR **/
            private RBCell fixAfterDeletion(RBCell rootValue)
            {
                RBCell x = this;

                while (x != rootValue && colorOf(x))
                {
                    if (x == leftOf(parentOf(x)))
                    {
                        RBCell sib = rightOf(parentOf(x));
                        if (!colorOf(sib))
                        {
                            setColor(sib, BLACK);
                            setColor(parentOf(x), RED);
                            rootValue = parentOf(x).rotateLeft(rootValue);
                            sib       = rightOf(parentOf(x));
                        }
                        if (colorOf(leftOf(sib)) && colorOf(rightOf(sib)))
                        {
                            setColor(sib, RED);
                            x = parentOf(x);
                        }
                        else
                        {
                            if (colorOf(rightOf(sib)))
                            {
                                setColor(leftOf(sib), BLACK);
                                setColor(sib, RED);
                                rootValue = sib.rotateRight(rootValue);
                                sib       = rightOf(parentOf(x));
                            }
                            setColor(sib, colorOf(parentOf(x)));
                            setColor(parentOf(x), BLACK);
                            setColor(rightOf(sib), BLACK);
                            rootValue = parentOf(x).rotateLeft(rootValue);
                            x         = rootValue;
                        }
                    }
                    else // symmetric
                    {
                        RBCell sib = leftOf(parentOf(x));
                        if (!colorOf(sib))
                        {
                            setColor(sib, BLACK);
                            setColor(parentOf(x), RED);
                            rootValue = parentOf(x).rotateRight(rootValue);
                            sib       = leftOf(parentOf(x));
                        }
                        if (colorOf(rightOf(sib)) && colorOf(leftOf(sib)))
                        {
                            setColor(sib, RED);
                            x = parentOf(x);
                        }
                        else
                        {
                            if (colorOf(leftOf(sib)))
                            {
                                setColor(rightOf(sib), BLACK);
                                setColor(sib, RED);
                                rootValue = sib.rotateLeft(rootValue);
                                sib       = leftOf(parentOf(x));
                            }
                            setColor(sib, colorOf(parentOf(x)));
                            setColor(parentOf(x), BLACK);
                            setColor(leftOf(sib), BLACK);
                            rootValue = parentOf(x).rotateRight(rootValue);
                            x         = rootValue;
                        }
                    }
                }
                setColor(x, BLACK);
                return(rootValue);
            }
Ejemplo n.º 2
0
            /** From CLR **/ private RBCell fixAfterInsertion(RBCell rootValue)
            {
                this.colorValue = RED;
                RBCell x = this;

                while (x != null && x != rootValue && !x.parentValue.colorValue)
                {
                    if (parentOf(x) == leftOf(parentOf(parentOf(x))))
                    {
                        RBCell y = rightOf(parentOf(parentOf(x)));
                        if (!colorOf(y))
                        {
                            setColor(parentOf(x), BLACK);
                            setColor(y, BLACK);
                            setColor(parentOf(parentOf(x)), RED);
                            x = parentOf(parentOf(x));
                        }
                        else
                        {
                            if (x == rightOf(parentOf(x)))
                            {
                                x         = parentOf(x);
                                rootValue = x.rotateLeft(rootValue);
                            }
                            setColor(parentOf(x), BLACK);
                            setColor(parentOf(parentOf(x)), RED);
                            if (parentOf(parentOf(x)) != null)
                            {
                                rootValue = parentOf(parentOf(x)).rotateRight(rootValue);
                            }
                        }
                    }
                    else
                    {
                        RBCell y = leftOf(parentOf(parentOf(x)));
                        if (!colorOf(y))
                        {
                            setColor(parentOf(x), BLACK);
                            setColor(y, BLACK);
                            setColor(parentOf(parentOf(x)), RED);
                            x = parentOf(parentOf(x));
                        }
                        else
                        {
                            if (x == leftOf(parentOf(x)))
                            {
                                x         = parentOf(x);
                                rootValue = x.rotateRight(rootValue);
                            }
                            setColor(parentOf(x), BLACK);
                            setColor(parentOf(parentOf(x)), RED);
                            if (parentOf(parentOf(x)) != null)
                            {
                                rootValue = parentOf(parentOf(x)).rotateLeft(rootValue);
                            }
                        }
                    }
                }
                rootValue.colorValue = BLACK;
                return(rootValue);
            }