在删除二叉排序树上某个结点之后,仍然保持二叉排序树的特性,即:二叉排序树中任一结点x,其左(右)子树中任一结点y(若存在)的关键字必小(大)于x的关键字
删除结点有三种情况
1.被删除的结点是叶子
2.被删除的结点只有左子树或者只有右子树
3.被删除的结点既有左子树,也有右子树
第一种:被删除的结点是叶子
由于要删除的结点p即无左子树,又无右子树,
因此删除结点p之后不会破坏二叉排序树结构的完整性,
只要将其双亲结点f原来指向p的指针改为指向空即可
第二种:被删除的结点只有左子树或者只有右子树
要删除的结点p只有左子树PL或者右子树PR,
这时候只要将p的左子树PL或p的右子树PR
直接作为其双亲结点f 的相应左子树或右子树即可
第三种:被删除的结点既有左子树,也有右子树
要删除的结点p只有左子树PL或者右子树PR,
第一种方法是:
要删除结点p若为其双亲结点f 的右子树,
则令p的左子树PL成为其双亲结点f 的右子树,
然后令p的右子树PR成为中序遍历下p的直接前驱s的右子树
例一:
先写出该树的中序遍历顺序:CL,C,QL, Q,SL,S,P,PR,F
此时p的直接前驱为S,则删除P的时候,P的右子树作为S的右子树
同时将p的左子树作为其双亲节点的左子树即可
第二种方法是:
令p的中序下的直接前驱s或直接后继结点代替p结点,
同时删除其中序下的前驱结点s(或中序下的后继结点)