Beispiel #1
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);
        }
Beispiel #2
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);
            }
        }