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;
}
最複雜的就是删除結點有左右孩子的
采用替換法的思想,找待删除結點左子樹中最大的值替換或者右子樹中最小的值替換,才能保證二叉搜尋樹的結構完整。
換節點的方式