450. Delete Node in a BST
2021-02-01 本文已影响0人
jluemmmm
删除 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;
}