/// <summary> /// Attempts to remove the specified data element from the BST. /// </summary> /// <param name="data">The data to remove from the BST.</param> /// <returns>True if the element is found in the tree, and removed; false if the element is not /// found in the tree.</returns> public bool Remove(T data) { // first make sure there exist some items in this tree if (root == null) { return(false); // no items to remove } // Now, try to find data in the tree BinaryTreeNode <T> current = root, parent = null; int result = comparer.Compare(current.Value, data); while (result != 0) { if (result > 0) { // current.Value > data, if data exists it's in the left subtree parent = current; current = current.Left; } else if (result < 0) { // current.Value < data, if data exists it's in the right subtree parent = current; current = current.Right; } // If current == null, then we didn't find the item to remove if (current == null) { return(false); } else { result = comparer.Compare(current.Value, data); } } // At this point, we've found the node to remove count--; // We now need to "rethread" the tree // CASE 1: If current has no right child, then current's left child becomes // the node pointed to by the parent if (current.Right == null) { if (parent == null) { root = current.Left; } else { result = comparer.Compare(parent.Value, current.Value); if (result > 0) { // parent.Value > current.Value, so make current's left child a left child of parent parent.Left = current.Left; } else if (result < 0) { // parent.Value < current.Value, so make current's left child a right child of parent parent.Right = current.Left; } } } // CASE 2: If current's right child has no left child, then current's right child // replaces current in the tree else if (current.Right.Left == null) { current.Right.Left = current.Left; if (parent == null) { root = current.Right; } else { result = comparer.Compare(parent.Value, current.Value); if (result > 0) { // parent.Value > current.Value, so make current's right child a left child of parent parent.Left = current.Right; } else if (result < 0) { // parent.Value < current.Value, so make current's right child a right child of parent parent.Right = current.Right; } } } // CASE 3: If current's right child has a left child, replace current with current's // right child's left-most descendent else { // We first need to find the right node's left-most child BinaryTreeNode <T> leftmost = current.Right.Left, lmParent = current.Right; while (leftmost.Left != null) { lmParent = leftmost; leftmost = leftmost.Left; } // the parent's left subtree becomes the leftmost's right subtree lmParent.Left = leftmost.Right; // assign leftmost's left and right to current's left and right children leftmost.Left = current.Left; leftmost.Right = current.Right; if (parent == null) { root = leftmost; } else { result = comparer.Compare(parent.Value, current.Value); if (result > 0) { // parent.Value > current.Value, so make leftmost a left child of parent parent.Left = leftmost; } else if (result < 0) { // parent.Value < current.Value, so make leftmost a right child of parent parent.Right = leftmost; } } } // Clear out the values from current current.Left = current.Right = null; current = null; return(true); }
/// <summary> /// Removes the contents of the BST /// </summary> public void Clear() { root = null; count = 0; }