day22- 235. 二叉搜索树的最近公共祖先 | 701.二叉搜索树中的插入操作 | 450.删除二叉搜索树中的节点

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

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

题目要求:

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。

🤔解题思路

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        // 遍历到其中一个目标节点,则直接返回该节点,因为p、q节点一定存在,且该树为二叉搜索树,遍历指定遍历方向,当遍历到其中一个目标节点时,另一个目标节点一定为该节点的子节点
        if(root.val == p.val || root.val == q.val) return root;
        //如果目标节点的值都小于当前节点的值,则向左递归
        if(root.val > p.val && root.val > q.val) return lowestCommonAncestor(root.left,p,q);
        //如果目标节点的值都大于当前节点的值,则向右递归
        else if(root.val < p.val && root.val < q.val) return lowestCommonAncestor(root.right,p,q);
        //如果目标节点位于当前节点的左右两侧,则说明当前节点为两个节点的最近共同祖父节点
        else return root;
    }
}

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

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

题目要求:

给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。

注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。

🤔解题思路

class Solution {
    public TreeNode insertIntoBST(TreeNode root, int val) {
        //退出递归的条件,遍历到null节点,也就是插入节点的位置
        if(root == null){
            TreeNode node = new TreeNode(val);
            return node;
        }
        if(root.val > val) root.left = insertIntoBST(root.left,val);
        if(root.val < val) root.right = insertIntoBST(root.right,val);
        return root;
    }
}

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

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

题目要求:

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

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

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

🤔解题思路

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        //退出递归的条件
        //1.没有找到目标节点
        if(root == null) return null;
        //找到目标节点
        if(root.val == key){
            //2.目标节点为叶子节点,左空右空
            if(root.left == null && root.right == null) return null;
            //3.左空右不空
            else if(root.left == null && root.right != null) return root.right;
            //4.做不空右空
            else if(root.left != null && root.right == null) return root.left;
            //左右都不为空,直接将左子树移到比当前节点大一点右子树叶子节点下面
            else{
                TreeNode cur = root.right;
                while(cur.left != null){
                    cur = cur.left;
                }
                cur.left = root.left;
                return root.right;
            }
        }
        if(key > root.val) root.right = deleteNode(root.right,key);
        if(key < root.val) root.left = deleteNode(root.left,key);
        return root;
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值