3种写法:
1,使用递归
对于有左右孩子的情况:
2,删除的时候,如果需要替换,直接进行节点的替换,【这个是节点和值一同替换】
3,删除的时候,如果需要替换,值替换,【节点不变,将节点的值换一下】
public void delete(Key key) {
delete(root ,key);
}
public Node delete(Node x,Key key) {
if (x==null) {
return null;
}
int cmp = key.compareTo(x.key);
if (cmp0) {
x.right = delete(x.right,key);
}else if (cmp0) {
x.left = delete(x.left,key);
}else {
//如果key等于x结点的键,完成真正的删除结点动作,要删除的结点就是x;
//让元素个数-1
N--;
//得找到右子树中最小的结点
if (x.right==null){
return x.left;
}
if (x.left==null){
return x.right;
}
最复杂的就是删除结点有左右孩子的
采用替换法的思想,找待删除结点左子树中最大的值替换或者右子树中最小的值替换,才能保证二叉搜索树的结构完整。