(Binary Tree Delete) In this exercise, we discuss deleting items from binary
search trees. The deletion algorithm is not as straightforward as the
insertion algorithm. There are three cases that are encountered when deleting
an itemthe item is contained in a leaf node (i.e., it has no children), the
item is contained in a node that has one child or the item is contained in a
node that has two children.
If the item to be deleted is contained in a leaf node, the node is deleted and
the pointer in the parent node is set to null.
If the item to be deleted is contained in a node with one child, the pointer
in the parent node is set to point to the child node and the node containing
the data item is deleted. This causes the child node to take the place of the
deleted node in the tree.
The last case is the most difficult. When a node with two children is deleted,
another node in the tree must take its place. However, the pointer in the
parent node cannot be assigned to point to one of the children of the node to
be deleted. In most cases, the resulting binary search tree would not adhere
to the following characteristic of binary search trees (with no duplicate
values): The values in any left subtree are less than the value in the parent
node, and the values in any right subtree are greater than the value in the
parent node.
Which node is used as a replacement node to maintain this characteristic?
Either the node containing the largest value in the tree less than the value
in the node being deleted, or the node containing the smallest value in the
tree greater than the value in the node being deleted. Let us consider the
node with the smaller value. In a binary search tree, the largest value less
than a parent's value is located in the left subtree of the parent node and is
guaranteed to be contained in the rightmost node of the subtree. This node is
located by walking down the left subtree to the right until the pointer to the
right child of the current node is null. We are now pointing to the
replacement node, which is either a leaf node or a node with one child to its
left. If the replacement node is a leaf node, the steps to perform the
deletion are as follows:
1\. Store the pointer to the node to be deleted in a temporary pointer
variable (this pointer is used to delete the dynamically allocated memory
2\. Set the pointer in the parent of the node being deleted to point to the
replacement node.
[Page \(1042]\)
3\. Set the pointer in the parent of the replacement node to null.
4\. Set the pointer to the right subtree in the replacement node to point to
the right subtree of the node to be deleted.
5\. Delete the node to which the temporary pointer variable points.
The deletion steps for a replacement node with a left child are similar to
those for a replacement node with no children, but the algorithm also must
move the child into the replacement node's position in the tree. If the
replacement node is a node with a left child, the steps to perform the
deletion are as follows:
1\. Store the pointer to the node to be deleted in a temporary pointer
variable.
2\. Set the pointer in the parent of the node being deleted to point to the
replacement node.
3\. Set the pointer in the parent of the replacement node to point to the left
child of the replacement node.
4\. Set the pointer to the right subtree in the replacement node to point to
the right subtree of the node to be deleted.
5\. Delete the node to which the temporary pointer variable points.
Write member function deleteNode, which takes as its arguments a pointer to
the root node of the tree object and the value to be deleted. The function
should locate in the tree the node containing the value to be deleted and use
the algorithms discussed here to delete the node. The function should print a
message that indicates whether the value is deleted. Modify the program of
Figs. 21.2021 .22 to use this function. After deleting an item, call the
inorder, preorder and postorder TRaversal functions to confirm that the delete
operation was performed correctly.