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

代码随想录 (programmercarl.com)

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

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

只要遍历二叉搜索树,找到空节点 插入元素就可以了,那么这道题其实就简单了

class Solution {
    public TreeNode insertIntoBST(TreeNode root, int val) {
        if(root == null){
            TreeNode node = new TreeNode(val);
            return node;
        }
        if (val < root.val){
            root.left = insertIntoBST(root.left, val);
        }
        if (val > root.val){
            root.right = insertIntoBST(root.right, val);
        }
        return root;
    }
}

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

需要修改二叉搜索树的结构,难。

五种情况分析:

1.未找到需要删除的节点:不做处理

2.找到删除的节点:

        2.1.需要删除的节点是叶子节点,左为空,右也为空:直接删除,不修改树的结构;

        2.2.需要删除的节点左不为空,右为空:直接跳过中间需要删除的节点,让不为空的左节点指向删除节点原本指向的节点;

        2.3.需要删除的节点左为空,右不为空:直接跳过中间需要删除的节点,同2.2操作;

        2.4.需要删除的节点左不为空,右也不空:右子树继位--将需要删除的节点的左孩子放在右边孩子的最左侧的值(这个节点的值比需要删除节点大一点点),变为删除节点左为空右不为空的2.3情况;左子树继位类似。

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        if (root == null){ //一直遍历未找到需要删除的节点
            return null;
        }
        if (root.val == key){
            if (root.left == null && root.right == null){
                return null;
            } else if (root.left != null && root.right == null) {
                return root.left;
            } else if (root.left == null && root.right != null){
                return root.right;
            } else if (root.left != null && root.right != null) {
                TreeNode cur = root.right;
                while (cur.left != null){
                    cur = cur.left;
                }
                cur.left = root.left;
                return root.right;
            }
        }
        //以上为终止条件
        if(key < root.val){
            root.left = deleteNode(root.left, key);
        } else if (key > root.val) {
            root.right = deleteNode(root.right, key);
        }
        return root;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Buuuleven.(程序媛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值