internal AVLTreeNode(AVLTreeNode <T> parent, T value) { Parent = parent; Value = value; Height = 0; }
//O(log(n)) always private void delete(AVLTreeNode <T> node, T value) { var baseCase = false; var compareResult = node.Value.CompareTo(value); //node is less than the search value so move right to find the deletion node if (compareResult < 0) { if (node.Right == null) { throw new Exception("Item do not exist"); } delete(node.Right, value); } //node is less than the search value so move left to find the deletion node else if (compareResult > 0) { if (node.Left == null) { throw new Exception("Item do not exist"); } delete(node.Left, value); } else { //node is a leaf node if (node.IsLeaf) { //if node is root if (node.Parent == null) { Root = null; } //assign nodes parent.left/right to null else if (node.Parent.Left == node) { node.Parent.Left = null; } else { node.Parent.Right = null; } baseCase = true; } else { //case one - right tree is null (move sub tree up) if (node.Left != null && node.Right == null) { //root if (node.Parent == null) { Root.Left.Parent = null; Root = Root.Left; } else { //node is left child of parent if (node.Parent.Left == node) { node.Parent.Left = node.Left; } //node is right child of parent else { node.Parent.Right = node.Left; } node.Left.Parent = node.Parent; } baseCase = true; } //case two - left tree is null (move sub tree up) else if (node.Right != null && node.Left == null) { //root if (node.Parent == null) { Root.Right.Parent = null; Root = Root.Right; } else { //node is left child of parent if (node.Parent.Left == node) { node.Parent.Left = node.Right; } //node is right child of parent else { node.Parent.Right = node.Right; } node.Right.Parent = node.Parent; } baseCase = true; } //case three - two child trees //replace the node value with maximum element of left subtree (left max node) //and then delete the left max node else { var maxLeftNode = findMax(node.Left); node.Value = maxLeftNode.Value; if (nodeLookUp != null) { nodeLookUp[node.Value] = node; } //delete left max node delete(node.Left, maxLeftNode.Value); } } } if (baseCase) { UpdateHeight(node.Parent); balance(node.Parent); } else { UpdateHeight(node); balance(node); } }