/// <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); }
/// <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); } }