public void InOrder(IAVLNode <K, V> Subroot, AVLTreeVisitor <K, V> v, int level) { if (Subroot == null) { return; } v.PreVisit(Subroot, level); InOrder(Subroot.Left, v, level + 1); v.Visit(Subroot, level); InOrder(Subroot.Right, v, level + 1); v.PostVisit(Subroot, level); }
public void PreVisit(IAVLNode <K, V> node, int level) { Console.Write("("); }
public void Visit(IAVLNode <K, V> node, int level) { var n = node as IAVLNode <K, V>; Console.Write($"{level}:{node.Key}"); }
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); } }