public bool Delete(T value) { if (this.Root == null) { return(false); } if (this.Root.Value.CompareTo(value) == 0 && this.Root.IsLeaf) { this.Root = null; return(true); } var nodeToRemove = this.Search(value); if (nodeToRemove == null) { return(false); } this.Delete(nodeToRemove); return(true); }
public void Clear() { Root = null; }
// Maximum of left subtree public BinarySearchTreeNode <T> Predecessor(BinarySearchTreeNode <T> node) { return(Maximum(node.Left)); }
// Minimum of right subtree public BinarySearchTreeNode <T> Successor(BinarySearchTreeNode <T> node) { return(Minimum(node.Right)); }
private void Delete(BinarySearchTreeNode <T> node) { // if node hasn't children then just remove this node if (node.IsLeaf) { if (node.IsLeftChild) { node.Parent.Left = null; } else if (node.IsRightChild) { node.Parent.Right = null; } node.Parent = null; return; } // if node has only 1 child then replace node by child if (node.HasLeft ^ node.HasRight) { if (!node.HasParent) { if (!node.HasRight && node.HasLeft) { Root = node.Left; } else if (node.HasRight && !node.HasLeft) { Root = node.Right; } Root.Parent = null; return; } if (node.HasLeft) { if (node.IsLeftChild) { node.Parent.Left = node.Left; } else { node.Parent.Right = node.Left; } node.Left.Parent = node.Parent; } else if (node.HasRight) { if (node.IsLeftChild) { node.Parent.Left = node.Right; } else { node.Parent.Right = node.Right; } node.Right.Parent = node.Parent; } return; } // if node has both childs var successor = Successor(node); node.Value = successor.Value; this.Delete(successor); }