美文网首页
450. Delete Node in a BST

450. Delete Node in a BST

作者: jluemmmm | 来源:发表于2021-02-01 21:16 被阅读0次

    删除 BST 中的指定元素,并维持二叉树的结构不变。

    • 前驱节点:节点val值小于该节点 val值,并且值最大的节点
    • 后继节点:节点val 值大于该节点val值,并且值最大的节点

    遍历,找到元素后:

    • 如果左子节点不存在,返回右子节点
    • 如果右节点不存在,返回左子节点
    • 否则,找到右子节点的前驱节点,进行相应替换

    时间复杂度 O(logN),空间复杂度O(H)

    • Runtime: 116 ms, faster than 53.42%
    • Memory Usage: 46.8 MB, less than 90.96%
    /**
     * Definition for a binary tree node.
     * function TreeNode(val, left, right) {
     *     this.val = (val===undefined ? 0 : val)
     *     this.left = (left===undefined ? null : left)
     *     this.right = (right===undefined ? null : right)
     * }
     */
    /**
     * @param {TreeNode} root
     * @param {number} key
     * @return {TreeNode}
     */
    var deleteNode = function(root, key) {
      if (!root) {
        return null;
      }
      if (root.val < key) {
        root.right = deleteNode(root.right, key)
      } else if (root.val > key) {
        root.left = deleteNode(root.left, key);
      } else {
        if (!root.left) return root.right;
        if (!root.right) return root.left;
        let ans = root;
        root = findPredecessor(ans.right);
        root.right = findSuccessor(ans.right);
        root.left = ans.left;
      }
      return root;
    };
    
    var findPredecessor = function(root) {
      if (!root.left) {
        return root;
      }
      return findPredecessor(root.left);
    }
    
    var findSuccessor = function(root) {
      if (!root.left) {
        return root.right;
      }
      root.left = findSuccessor(root.left);
      return root;
    }
    

    相关文章

      网友评论

          本文标题:450. Delete Node in a BST

          本文链接:https://www.haomeiwen.com/subject/hrmjtltx.html