protected bool Add(IAVLNode <K, V> parent, ref AVLNode <K, V> Subroot, K Key, V Value) { if (Subroot == null) { Subroot = new AVLNode <K, V>(Key, Value); return(true); } int compare = Key.CompareTo(Subroot.Key); if (compare == 0) { // Key collision throw new Exception("Key collision"); } if (compare < 0) { var taller = Add(Subroot, ref Subroot.LeftNode, Key, Value); if (taller) { switch (Subroot.Balance) { case BalanceFactor.LEFT_HIGHER: LeftBalance(ref Subroot); taller = false; break; case BalanceFactor.EQUAL_HEIGHT: Subroot.Balance = BalanceFactor.LEFT_HIGHER; break; case BalanceFactor.RIGHT_HIGHER: Subroot.Balance = BalanceFactor.EQUAL_HEIGHT; taller = false; break; } } return(taller); } else { var taller = Add(Subroot, ref Subroot.RightNode, Key, Value); if (taller) { switch (Subroot.Balance) { case BalanceFactor.LEFT_HIGHER: Subroot.Balance = BalanceFactor.EQUAL_HEIGHT; taller = false; break; case BalanceFactor.EQUAL_HEIGHT: Subroot.Balance = BalanceFactor.RIGHT_HIGHER; break; case BalanceFactor.RIGHT_HIGHER: RightBalance(ref Subroot); taller = false; break; } } return(taller); } }