天天看點

二叉樹删除某一指定節點

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;
    }      

最複雜的就是删除結點有左右孩子的

采用替換法的思想,找待删除結點左子樹中最大的值替換或者右子樹中最小的值替換,才能保證二叉搜尋樹的結構完整。

換節點的方式