开启我的LeetCode刷题日记:450. 删除二叉搜索树中的节点

68 阅读2分钟

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

编程世界总是离不了算法

最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力

于是决定蹭着假期,加强算法和数据结构相关的知识

那怎么提升呢?

其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode刷题之旅

第一阶段目标是:200道,每天12

为了不乱,本系列文章目录分为三部分:

  1. 今日题目:xxx
  2. 我的思路
  3. 代码实现

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

给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

一般来说,删除节点可分为两个步骤:

  • 首先找到需要删除的节点;
  • 如果找到了,删除它。  

示例 1:

输入: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]。

示例 2:

输入: root = [5,3,6,2,4,null,7], key = 0
输出: [5,3,6,2,4,null,7]
解释: 二叉树不包含值为 0 的节点

示例 3:

输入: root = [], key = 0
输出: []

提示:

  • 节点数的范围 [0, 104].
  • -105 <= Node.val <= 105
  • 节点值唯一
  • root 是合法的二叉搜索树
  • -105 <= key <= 105

我的思路

1、如果没有root直接返回null 2、如果查到了root.val等于key,那么就检查是否有左右子树 2.1、如果没有左子树,说明是单一右子树,则返回右子树的孩子即可,反之亦然 2.2、如果左右子树都有,则找当前root跟的后继,找到后继后删除,将后继的值赋值给根的值 3、如果当前跟的值大于key,则向左子树删除查找,反之亦然

代码实现

/**
 * 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) {
    // 如果没有root直接返回null
    if (root === null) return null;
    // 如果查到了root.val等于key,那么就检查是否有左右子树
    // 如果没有左子树,说明是单一右子树,则返回右子树的孩子即可,反之亦然
    // 如果左右子树都有,则找当前root跟的后继,找到后继后删除,将后继的值赋值给根的值
    if (root.val === key) {
        if (root.left === null) return root.right;
        if (root.right === null) return root.left;
        let next = root.right;
        while (next.left) next = next.left;
        root.right = deleteNode(root.right, next.val);
        root.val = next.val;
        return root;
    }
    // 如果当前跟的值大于key,则向左子树删除查找,反之亦然
    if (root.val > key) {
        root.left = deleteNode(root.left, key);
    } else {
        root.right = deleteNode(root.right, key);
    }
    return root;
};

总结

实现方式其实有很多,这里仅供参考~

由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹