コード例 #1
0
        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);
            }
        }