代码随想录算法训练营第22天|235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点

235.二叉搜索树的最近公共祖先

题目链接:https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/

var lowestCommonAncestor = function(root, p, q) {
    // 终止条件
    if(root === null) {
        return root;
    }
    // 确定单层递归逻辑
    if(root.val > p.val && root.val > q.val) {
        // 向左子树查询
         return root.left = lowestCommonAncestor(root.left,p,q);
    }
    if(root.val < p.val && root.val < q.val) {
        // 向右子树查询
        return root.right = lowestCommonAncestor(root.right,p,q);
    }
    return root;
};

解题思路:

1.利用二叉搜索树的特性,根节点比左子树任意元素都大,比右子树上任意元素都小。

2.从上往下遍历,此次遍历没有所谓的中序,只看左右即可,第一次遇到p和q之间的数则为它两的最近公共祖先。因为如果再向下遍历要么无法遍历到p,要么无法遍历到q,总有一个无法遍历到。所以第一次遇到的处于它两之间的数则为最近公共祖先。

701.二叉搜索树中的插入操作

题目链接:https://leetcode.cn/problems/insert-into-a-binary-search-tree/

var insertIntoBST = function(root, val) {
const insertData=function(root,val){
    // 确定终止条件
    if(root===null){
        let node=new TreeNode(val)
        return node
    }
    // 确定单层递归逻辑
    if(root.val>val){
        root.left=insertData(root.left,val)
    }
    else if(root.val<val){
        root.right=insertData(root.right,val)
    }
    return root
}
return insertData(root,val)
};

解题思路:

1.主要是利用二叉搜索树的特性来解题,然后每次都和根节点比较,如果大于根节点放在右子树,小于根节点放在左子树,具体放在那个位置依旧按上述操作比较,直到比较的节点为空,或者不适合,把新的节点放入此位置即可。

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

题目链接:https://leetcode.cn/problems/delete-node-in-a-bst/

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 {
        // 场景1: 该节点是叶节点
        if (!root.left && !root.right) {
            return null
        }
        // 场景2: 有一个孩子节点不存在
        if (root.left && !root.right) {
            return root.left;
        } else if (root.right && !root.left) {
            return root.right;
        }
        // 场景3: 左右节点都存在
        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;
}

解题思路:

1.删除二叉搜索树中的节点考虑的情况比较多。主要分为5种情况

2.、

5种具体情况:

1>当没有找到要删除的节点时

2>删除的是叶子节点,左右都为空

3>当能找到删除的节点,且左为空,右不为空

4>当能找到删除的节点,且右为空,左不为空

5>左右都不为空的情况下,在此种情况下设置一个变量为所要删除节点的右节点,找到除了比需要删除节点的数大一点的数将要删除节点的左子树以其为根节点放入此位置。遍历所设置变量对应的左子树,直至其为空,将根节点的左子树放入此位置即可,返回右子树的值,这里就相当于和左为空,右不为空的情况是一样的。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值