Esempio n. 1
0
        private BaseNode <TKey, TValue> DeleteNode(BaseNode <TKey, TValue> x, TKey key)
        {
            if (x == null)
            {
                return(null);
            }

            int cmp = key.CompareTo(x.key);

            if (cmp < 0)
            {
                x.left = DeleteNode(x.left, key);
            }
            else if (cmp > 0)
            {
                x.right = DeleteNode(x.right, key);
            }
            else
            {
                if (x.right == null)
                {
                    return(x.left);
                }
                if (x.left == null)
                {
                    return(x.right);
                }
                BaseNode <TKey, TValue> t = x;
                x       = MinimumNode(t.right);
                x.right = DeleteMinimum(t.right);
                x.left  = t.left;
            }
            x.UpdateSize();
            return(x);
        }
Esempio n. 2
0
        /// <summary>
        /// Randomized insertion.
        /// make new node the root with uniform probability
        /// </summary>
        /// <param name="x"></param>
        /// <param name="key"></param>
        /// <param name="val"></param>
        /// <returns></returns>
        internal override BaseNode <TKey, TValue> PutKey(BaseNode <TKey, TValue> x, TKey key, TValue val)
        {
            if (x == null)
            {
                return(new BaseNode <TKey, TValue>(key, val, 1));
            }
            int cmp = key.CompareTo(x.key);

            if (cmp == 0)
            {
                x.val = val;
                return(x);
            }

            if (StdRandom.bernoulli(1.0 / (x.Size + 1.0)))
            {
                return(PutRoot(x, key, val));
            }
            if (cmp < 0)
            {
                x.left = PutKey(x.left, key, val);
            }
            else
            {
                x.right = PutKey(x.right, key, val);
            }

            x.UpdateSize();
            return(x);
        }
Esempio n. 3
0
 private BaseNode <TKey, TValue> DeleteMinimum(BaseNode <TKey, TValue> x)
 {
     if (x.left == null)
     {
         return(x.right);
     }
     x.left = DeleteMinimum(x.left);
     x.UpdateSize();
     return(x);
 }
Esempio n. 4
0
        private BaseNode <TKey, TValue> RotateLeft(BaseNode <TKey, TValue> h)
        {
            var x = h.right;

            h.right = x.left;
            x.left  = h;
            h.UpdateSize();
            x.UpdateSize();
            return(x);
        }
        /// <summary>
        /// Insert key-value pair into symbol table (nonrecursive version).
        /// </summary>
        /// <param name="key">key to insert</param>
        /// <param name="val">value for key</param>
        public override void Put(TKey key, TValue val)
        {
            int cmp = 0;
            var z   = new BaseNode <TKey, TValue>(key, val, 1);

            if (root == null)
            {
                root = z;
                return;
            }

            BaseNode <TKey, TValue> parent = null, x = root;

            while (x != null)
            {
                parent = x;
                cmp    = key.CompareTo(x.key);
                if (cmp < 0)
                {
                    x = x.left;
                }
                else if (cmp > 0)
                {
                    x = x.right;
                }
                else
                {
                    x.val = val;
                    return;
                }
            }

            cmp = key.CompareTo(parent.key);
            if (cmp < 0)
            {
                parent.left = z;
            }
            else
            {
                parent.right = z;
            }

            parent.UpdateSize();
        }
Esempio n. 6
0
        internal override BaseNode <TKey, TValue> PutKey(BaseNode <TKey, TValue> x, TKey key, TValue val)
        {
            if (x == null)
            {
                return(new BaseNode <TKey, TValue>(key, val, 1));
            }
            int cmp = key.CompareTo(x.key);

            if (cmp < 0)
            {
                x.left = PutKey(x.left, key, val);
            }
            else if (cmp > 0)
            {
                x.right = PutKey(x.right, key, val);
            }
            else
            {
                x.val = val;
            }
            x.UpdateSize();
            return(x);
        }
Esempio n. 7
0
        private BaseNode <TKey, TValue> Remove(BaseNode <TKey, TValue> x, TKey key)
        {
            if (x == null)
            {
                return(null);
            }
            int cmp = key.CompareTo(x.key);

            if (cmp == 0)
            {
                x = joinLR(x.left, x.right);
            }
            else if (cmp < 0)
            {
                x.left = Remove(x.left, key);
            }
            else
            {
                x.right = Remove(x.right, key);
            }
            x.UpdateSize();
            return(x);
        }
Esempio n. 8
0
        /// <summary>
        /// Randomized deletion.
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <returns></returns>
        private BaseNode <TKey, TValue> joinLR(BaseNode <TKey, TValue> a, BaseNode <TKey, TValue> b)
        {
            if (a == null)
            {
                return(b);
            }
            if (b == null)
            {
                return(a);
            }

            if (StdRandom.bernoulli((double)a.Size / (a.Size + b.Size)))
            {
                a.right = joinLR(a.right, b);
                a.UpdateSize();
                return(a);
            }
            else
            {
                b.left = joinLR(a, b.left);
                b.UpdateSize();
                return(b);
            }
        }