Esempio n. 1
0
        AvlNode <KeyValuePair <TKey, TValue> > Add(AvlNode <KeyValuePair <TKey, TValue> > node, TKey key, TValue value)
        {
            if (node == null)
            {
                ++Count;
                return(new AvlNode <KeyValuePair <TKey, TValue> > {
                    Key = new KeyValuePair <TKey, TValue>(key, value)
                });
            }

            var d = compare(key, node.Key.Key);

            if (d == 0)
            {
                return(node);
            }

            if (d < 0)
            {
                node.TypedLeft = Add(node.TypedLeft, key, value);
            }
            else
            {
                node.TypedRight = Add(node.TypedRight, key, value);
            }

            var lrh = node.LeftHeight - node.RightHeight;

            if (lrh > 2 || lrh == 2 && node.TypedLeft.LeftHeight >= node.TypedLeft.RightHeight)
            {
                node = node.RotateToRight() as AvlNode <KeyValuePair <TKey, TValue> >;
                node.TypedRight.UpdateHeight();
            }
            else if (lrh < -2 || lrh == -2 && node.TypedRight.LeftHeight <= node.TypedRight.RightHeight)
            {
                node = node.RotateToLeft() as AvlNode <KeyValuePair <TKey, TValue> >;
                node.TypedLeft.UpdateHeight();
            }

            node.UpdateHeight();
            return(node);
        }
Esempio n. 2
0
        AvlNode <T> Add(AvlNode <T> node, T item)
        {
            if (node == null)
            {
                ++Count;
                return(new AvlNode <T> {
                    Key = item
                });
            }

            var d = compare(item, node.Key);

            if (d == 0)
            {
                return(node);
            }

            if (d < 0)
            {
                node.TypedLeft = Add(node.TypedLeft, item);
            }
            else
            {
                node.TypedRight = Add(node.TypedRight, item);
            }

            var lrh = node.LeftHeight - node.RightHeight;

            if (lrh > 2 || lrh == 2 && node.TypedLeft.LeftHeight >= node.TypedLeft.RightHeight)
            {
                node = node.RotateToRight() as AvlNode <T>;
                node.TypedRight.UpdateHeight();
            }
            else if (lrh < -2 || lrh == -2 && node.TypedRight.LeftHeight <= node.TypedRight.RightHeight)
            {
                node = node.RotateToLeft() as AvlNode <T>;
                node.TypedLeft.UpdateHeight();
            }

            node.UpdateHeight();
            return(node);
        }