private void FixHeight <T, V>(NodeTree <T, V> node) { var heightLeft = Height(node.Left); var heightRight = Height(node.Right); node.Height = (heightLeft > heightRight ? heightLeft : heightRight) + 1; }
private void AddItem(NodeTree <T, V> node, List <V> items) { if (node == null) { return; } AddItem(node.Left, items); items.Add(node.Item); AddItem(node.Right, items); }
private NodeTree <T, V> RotateLeft <T, V>(NodeTree <T, V> node) { var right = node.Right; node.Right = right.Left; right.Left = node; FixHeight(node); FixHeight(right); return(right); }
private NodeTree <T, V> RotateRight <T, V>(NodeTree <T, V> node) { var left = node.Left; node.Left = left.Right; left.Right = node; FixHeight(node); FixHeight(left); return(left); }
private V Find <T, V>(NodeTree <T, V> node, T key) { if (node == null) { throw new Exception("Not found item with same key"); } return(comparer.Compare(key, node.Key) switch { (int)ComparisonResult.Less => Find(node.Left, key), (int)ComparisonResult.More => Find(node.Right, key), _ => node.Item });
private NodeTree <T, V> Insert <T, V>(NodeTree <T, V> node, T key, V value) { if (node == null) { return(new NodeTree <T, V>(key, value)); } if (comparer.Compare(key, node.Key) == (int)ComparisonResult.Less) { node.Left = Insert(node.Left, key, value); } else { node.Right = Insert(node.Right, key, value); } return(Balance(node)); }
private int BFactor <T, V>(NodeTree <T, V> node) { return(Height(node.Right) - Height(node.Left)); }
private int Height <T, V>(NodeTree <T, V> node) { return(node?.Height ?? 0); }
public void Insert(T key, V value) { root = Insert <T, V>(root, key, value); Count++; }