コード例 #1
0
        public void Insert(AVLTreeNode <T> node, T value, bool balanceWhileInserting = true)
        {
            var comparisonResult = node.Value.CompareTo(value);

            if (comparisonResult < 0)
            {
                InsertNodeToRight(node, value, balanceWhileInserting);
            }

            if (comparisonResult > 0)
            {
                InsertNodeToLeft(node, value, balanceWhileInserting);
            }

            if (comparisonResult == 0)
            {
                throw new Exception("Value already exists!");
            }

            UpdateHeight(node);

            if (balanceWhileInserting)
            {
                Balance(node);
            }

            node.UpdateCounts();
        }
コード例 #2
0
        private void Delete(AVLTreeNode <T> node, bool balanceWhileDeleting = true)
        {
            if (node.IsLeaf)
            {
                DeleteRootOrLeftOrRightNode(node);
                node.UpdateCounts();
                node.UpdateHeights();
                if (balanceWhileDeleting)
                {
                    Balance(node);
                }
                return;
            }

            if (node.IsRightTreeNull)
            {
                PerformDeleteWhenRightTreeIsNull(node);
                node.UpdateCounts();
                node.UpdateHeights();
                if (balanceWhileDeleting)
                {
                    Balance(node);
                }
                return;
            }

            if (node.IsLeftTreeNull)
            {
                PerformDeleteWhenLeftTreeIsNull(node);
                node.UpdateCounts();
                node.UpdateHeights();
                if (balanceWhileDeleting)
                {
                    Balance(node);
                }
                return;
            }

            var maxOfLeftNode = FindMax(node.Left);

            node.Value = maxOfLeftNode.Value;
            FindNodeToBeDeleted(node.Left, maxOfLeftNode.Value, balanceWhileDeleting);
        }