题目
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/delete-node-in-a-bst
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;
如果找到了,删除它。
示例
输入:root = [5,3,6,2,4,null,7], key = 3
输出:[5,4,6,2,null,null,7]
解释:给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。
一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。
另一个正确答案是 [5,2,6,null,4,null,7]。
思路
作者:piny-lyo
链接:https://leetcode-cn.com/problems/delete-node-in-a-bst/solution/shan-chu-er-cha-sou-suo-shu-zhong-de-jie-wqnq/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
答案
function deleteNode(root, key) {
// base case
if (root === null) return null;
// 判断key值的三种情况
if (key < root.val) root.left = deleteNode(root.left, key); // 删除的节点在左边,修改左子树
else if (key > root.val) root.right = deleteNode(root.right, key); // 删除的节点在右边,修改右子树
else { // key === root.val 该节点要被删除
// 1. 该节点的两个子节点都为空;2. 该节点只有一个非空子节点。
if (root.left === null) return root.right;
if (root.right === null) return root.left;
// 3. 有两个非空子节点,找到右子树中最小的节点来替换。(结构替换而不是修改节点的值)
let minNode = getMinNode(root.right);
// 删除右子树的最小节点
root.right = deleteNode(root.right, minNode.val);
// 替换root节点
root.val=minNode.val;
}
return root;
};
function getMinNode(root) { //BST最左边的节点最小
while (root.left !== null) root = root.left;
return root;
}