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

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

题目

参考文章

思路:这题其实和寻找二叉树最近公共祖先差不多的思路。这里主要是利用了二叉搜索树的特点,这里因为二叉搜索树的特点,左边节点的值比根节点小,右边节点的值比根节点大。所以当当前节点的值大于p q时,直接遍历当前节点的左边节点,当当前节点的值小于p q 时,直接遍历当前节点的右边节点;若如上两个条件都不满足,则直接返回当前节点即可(因为这个时候pq在当前节点的左和右节点中,故直接返回当前节点)

代码:

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (root.val > p.val && root.val > q.val) return lowestCommonAncestor(root.left, p, q);
        if (root.val < p.val && root.val < q.val) return lowestCommonAncestor(root.right, p, q);
        return root;
    }
}

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

题目

参考文章

思路:这题其实就是利用二叉搜索树的特点,当要插入的节点大于当前节点值时,就遍历其右子树,当插入节点小于当前节点值时,就遍历其左子树。若遍历的的子树为空的时,表示找到了合适的插入位置,则新建树,并返回给上一层,然后层层返回,就把新二叉搜索树给构建好了。

代码:

class Solution {
    public TreeNode insertIntoBST(TreeNode root, int val) {
        if (root == null) // 如果当前节点为空,也就意味着val找到了合适的位置,则直接创建节点直接返回。
            return new TreeNode(val);
            
        if (root.val < val){
            root.right = insertIntoBST(root.right, val); // 递归创建右子树(也可以理解为更新右子树)
        }else if (root.val > val){
            root.left = insertIntoBST(root.left, val); // 递归创建左子树(也可以理解为更新左子树)
        }
        return root;
    }
    
}

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

题目

参考文章

思路:思路尽在代码中!!!!

代码:

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        // 第一种情况:没找到删除的节点,遍历到空节点直接返回了
        if (root == null) return root;
        
        if (root.val == key) {
            if (root.left == null) {//这里其实把叶子节点和左为空的节点都处理了,因为不论是叶子节点还是左为空的节点,之后返回右节点,其实都是可以的,不会影响二叉树
                return root.right;
            } else if (root.right == null) {//要删除的节点的右子树为空
                return root.left;
            } else {//左右节点都不为空
                TreeNode cur = root.right;//设置一个cur,因为左右节点不为空,则我们把要删除节点的右节点作为替代,替代这个要删除的节点值,随便要把要删除节点的左子树找一个合适的位置
                while (cur.left != null) {//遍历要删除节点右子树的左节点,遍历到最左边的节点(因为这个节点的值是比要删除的节点大,但是是其右子树中最小的,这个节点的左子树是最适合放要删除节点的左子树的所有节点的一个位置)
                cur = cur.left;
                }
                cur.left = root.left;//把要删除节点的左子树赋值给当前遍历到的最合适的位置的左子树上去
                root = root.right;//返回要删除的节点的右子树即可(因为前面已经把要删除节点的右子树更新完成(即基础完成),直接指向即可)
                return root;//返回后,就相当与把上一个节点的左或右子树直接指向到这个返回的root上
            }
        }
        //最后是利用二叉搜索树的特点,对二叉搜索树进行遍历,并把他们的返回值给接收
        if (root.val > key) root.left = deleteNode(root.left, key);
        if (root.val < key) root.right = deleteNode(root.right, key);
        return root;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值