Пример #1
0
        /// <summary>
        /// Applies rebalances after inserts
        /// </summary>
        /// <param name="node">Newly isnerted node</param>
        private void RebalanceAfterInsert(IBinaryTreeNode <TKey, TValue> node)
        {
            IBinaryTreeNode <TKey, TValue> current = node.Parent;

            while (current != null)
            {
                long balance = current.GetBalance();
                switch (balance)
                {
                case -2:
                case 2:
                    this.Rebalance(current, balance);
                    break;

                case -1:
                case 0:
                case 1:
                    //Balanced
                    break;

                default:
                    throw new InvalidOperationException("Illegal AVL Tree state");
                }
                current = current.Parent;
            }
        }
Пример #2
0
        /// <summary>
        /// Applies rebalances after deletes
        /// </summary>
        /// <param name="node">Node at which the delete occurred</param>
        protected sealed override void AfterDelete(IBinaryTreeNode <TKey, TValue> node)
        {
            IBinaryTreeNode <TKey, TValue> current = node.Parent;

            while (current != null)
            {
                long balance = current.GetBalance();
                if (Math.Abs(balance) == 1)
                {
                    break;                         //Short circuit where possible
                }
                if (Math.Abs(balance) == 2)
                {
                    this.Rebalance(current, balance);
                }
                current = current.Parent;
            }
        }