예제 #1
0
        /**
         * Method declaration
         *
         *
         * @param x
         * @param n
         *
         * @throws Exception
         */
        private void replace(Node x, Node n)
        {
            if (x.Equals(root))
            {
                root = n;

                if (n != null)
                {
                    n.setParent(null);
                }
            }
            else
            {
                set(x.getParent(), from(x), n);
            }
        }
예제 #2
0
        /**
         * Method declaration
         *
         *
         * @param x
         *
         * @return
         *
         * @throws Exception
         */
        public Node next(Node x)
        {
            if ((++iNeedCleanUp & 127) == 0)
            {
                x.rData.cleanUpCache();
            }

            Node r = x.getRight();

            if (r != null)
            {
                x = r;

                Node l = x.getLeft();

                while (l != null)
                {
                    if (Trace.STOP)
                    {
                        Trace.stop();
                    }

                    x = l;
                    l = x.getLeft();
                }

                return(x);
            }

            Node ch = x;

            x = x.getParent();

            while (x != null && ch.Equals(x.getRight()))
            {
                if (Trace.STOP)
                {
                    Trace.stop();
                }

                ch = x;
                x  = x.getParent();
            }

            return(x);
        }
예제 #3
0
        /**
         * Method declaration
         *
         *
         * @param x
         * @param n
         *
         * @throws Exception
         */
        private void replace(Node x, Node n)
        {
            if (x.Equals(root))
            {
                root = n;

                if (n != null)
                {
                    n.setParent(null);
                }
            }
            else
            {
                set(x.getParent(), from(x), n);
            }
        }
예제 #4
0
        /**
         * Method declaration
         *
         *
         * @param i
         *
         * @throws Exception
         */
        public void insert(Node i)
        {
            object[] data = i.getData();
            Node     n = root, x = n;
            bool     way     = true;
            int      compare = -1;

            while (true)
            {
                if (Trace.STOP)
                {
                    Trace.stop();
                }

                if (n == null)
                {
                    if (x == null)
                    {
                        root = i;

                        return;
                    }

                    set(x, way, i);

                    break;
                }

                x       = n;
                compare = compareRow(data, x.getData());

                Trace.check(compare != 0, Trace.VIOLATION_OF_UNIQUE_INDEX);

                way = compare < 0;
                n   = child(x, way);
            }

            while (true)
            {
                if (Trace.STOP)
                {
                    Trace.stop();
                }

                int sign = way ? 1 : -1;

                switch (x.getBalance() * sign)
                {
                case 1:
                    x.setBalance(0);

                    return;

                case 0:
                    x.setBalance(-sign);

                    break;

                case -1:
                    Node l = child(x, way);

                    if (l.getBalance() == -sign)
                    {
                        replace(x, l);
                        set(x, way, child(l, !way));
                        set(l, !way, x);
                        x.setBalance(0);
                        l.setBalance(0);
                    }
                    else
                    {
                        Node r = child(l, !way);

                        replace(x, r);
                        set(l, !way, child(r, way));
                        set(r, way, l);
                        set(x, way, child(r, !way));
                        set(r, !way, x);

                        int rb = r.getBalance();

                        x.setBalance((rb == -sign) ? sign : 0);
                        l.setBalance((rb == sign) ? -sign : 0);
                        r.setBalance(0);
                    }

                    return;
                }

                if (x.Equals(root))
                {
                    return;
                }

                way = from(x);
                x   = x.getParent();
            }
        }
예제 #5
0
        /**
         * Method declaration
         *
         *
         * @param x
         *
         * @return
         *
         * @throws Exception
         */
        private bool from(Node x)
        {
            if (x.Equals(root))
            {
                return true;
            }

            if (Trace.ASSERT)
            {
                Trace.assert(x.getParent() != null);
            }

            return x.Equals(x.getParent().getLeft());
        }