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(); }
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); }