在二叉排序树中删除一个结点
在二叉排序树中删除一个结点时,不能把以该结点为根的子树上的结点都删除,必须先把被删除结点从存储二叉排序树的链表上摘下,将因删除结点而断开的二叉链表重新链接起来,同时确保二叉排序树的性质不会丢失。
二叉排序树的删除要考虑三种情况:
- 若被删除结点x是叶子结点,则直接删除,并修改x的父结点的指针为NULL;
- 若被删除结点x只有一棵左子树或右子树,则让x的子树成为x父结点的子树,替代x的位置;
- 若被删除结点x有左、右两棵子树,则用另一结点替代被删除的结点x:x右子树的最小元素或者x左子树的最大元素,然后删除这个替代结点(因为在二叉排序树中右子树的最小元素、左子树的最大元素要么是叶子结点,要么只有一棵左子树或右子树,一定不会同时有左、右子树,这样就转换成了第一或第二种情况);
如有谬误或者不足还请批评指正!
BSTree Delete(BSTree BST, int x)
{
BSTNode *p;
if (BST == NULL) //如果树为空直接返回
return NULL;
else if