用时:30min

题目分两个部分需要解决,搜索和删除

搜索部分就是找到节点,可以根据二叉搜索树的性质来找到需要的节点

删除分三种情况

  1. 只有左孩子,用左孩子代替
  2. 只有右孩子,用右孩子代替
  3. 都没有,则赋值为null ( 由于前面有递归赋值,所以这边可以成功
  4. 都有,则储存左孩子后,用右孩子代替,然后找到左孩子在右边的位置
var deleteNode = function(root, key) {
    function  insert(root,node) {
        if (root.val > node.val) {
            if (!root.left) {
                root.left = node
            } else {
                insert(root.left,node)
            }
        } else {
            if (!root.right) {
                root.right = node
            } else {
                insert(root.right,node)
            }
        }
    }
    function search(root) {
      if (!root) {
        return null
      }
        if (root.val > key) {
            root.left = search(root.left)
        } else if (root.val < key){
            root.right = search(root.right)
        }  else {
            if (!root.left && !root.right) {
                root = null            } else if (root.left && root.right) {
                var left = root.left                root = root.right                insert(root,left)
            }
            else if (root.left) {
                root = root.left            } else if (root.right) {
                root = root.right            }
        }
        return root    }
    return search(root)
};

需要注意的点

  1. 考虑节点不存在的情况
  2. 删除一个节点的方法,可以给左(右 节点赋值为递归的返回值