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