450.删除二叉搜索树中的节点

167 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情

450.删除二叉搜索树中的节点

题目分析

题目给定一个二叉搜索树的根节点和一个key值,要求删除二叉搜索树中key对应的节点。并且保证删除节点后的树仍是二叉搜索树,返回二叉搜索树的根结点。

解题

首先来考虑递归的三要素:

  1. 参数和返回值

参数为节点和key值,这里和二叉搜索树的插入操作一样,通过递归返回删除节点。

  1. 终止条件

如果遇到空,证明遍历到空结点直接返回。

  1. 单层循环的逻辑

下面列举二叉搜索树中删除节点遇到的五种情况:

  1. 没有找到删除的节点遍历到空节点返回

找到删除的节点

  1. 左右孩子为空,直接删除返回null
  2. 删除节点的左孩子为空,右孩子不为空,删除节点后用右孩子代替删除的节点
  3. 删除节点的右孩子为空,左孩子不为空,删除节点后左孩子代替删除的节点
  4. 删除节点的左右孩子都不为空那么将删除节点的左子树放到删除节点的右子树最左边的左孩子上

代码如下:

var deleteNode = function(root, key) {
    if (!root) return null;
    if (key > root.val) {
        root.right = deleteNode(root.right, key);
        return root;
    } else if (key < root.val) {
        root.left = deleteNode(root.left, key);
        return root;
    } else {
        if (!root.left && !root.right) return null
        if (root.left && !root.right) return root.left;
        else if (root.right && !root.left) return root.right;
        const rightNode = root.right;
        const minNode = getMinNode(rightNode);
        root.val = minNode.val;
        root.right = deleteNode(root.right, minNode.val);
        return root;
    }
};
function getMinNode(root) {
    while (root.left) {
        root = root.left;
    }
    return root;
}

总结

这道题也是在上数据结构课的时候学过理论的知识,当时老师在PPT上给我们演示了完整的过程。如果想要更好的理解,最好是看一下动图。这样会理解的更透彻。