数据结构与算法--二叉搜索树

代码随想录day22

文章目录

  • 一、二叉搜索树中的搜索
  • 二、二叉搜索树的最近公共祖先
  • 三、二叉搜索树的插入操作
  • 四、删除二叉搜索树中的节点


一、二叉搜索树的搜索

   题目链接力扣700

先介绍一下二叉搜索树,二叉搜索树是有规律的,

二叉搜索树是一个有序树:

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  • 它的左、右子树也分别为二叉搜索树

所以二叉搜索树遍历起来还是比较方便的。

做题思路:做题之前想清楚递归的三个条件;1:确定递归函数的参数和返回值    2:确定终止条件     3:确定单层递归的的逻辑         下面三题都使用该步骤

跟普通二叉树的遍历是差不多的,这题也采用递归的方法,假如root.val>val,就说明目标值在左边,所以就执行root.left的操作;root.val<val,就明目标值在root的右边,就执行root.right的操作。

代码如下:

class Solution {
    // 递归,利用二叉搜索树特点,优化
    public TreeNode searchBST(TreeNode root, int val) {
        if (root == null || root.val == val) {
            return root;
        }
        if (val < root.val) {
            return searchBST(root.left, val);
        } else {
            return searchBST(root.right, val);
        }
    }
}

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

题目链接力扣235

做题思路:这篇全是用递归的方法解决,当root.val同时大于p和q和时候就执行root.left,当root.val同时小于p和q的时候,就执行root.right的操作,最终就能找到p和q的最近祖先。

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

 

做题思路:因为二叉搜索树是有规律的,所以插入的节点肯定落在尾部节点,这样就不会改变二叉搜索树的结构,会比较好做一点,(第三个图可以忽略,不用考虑那种写法)。本题依旧采用递归的方法,还是跟上两题的做法差不多,当root.val>val的时候,执行root.left的操作,就一直往左边搜索,右边跟这相反,我就不写了。等到最后的位置的时候,也就是root==null的时候,就在该位置插入目标节点。还有需要注意的几点我写在代码注释上,方便查看;

class Solution {
    public TreeNode insertIntoBST(TreeNode root, int val) {
         if(root==null){
             TreeNode node=new TreeNode(val);
             return node;//将node返回到上一个root.left(或者right),
                          //然后就让上一个root指向了node
         }

         if(root.val>val){
             root.left=insertIntoBST(root.left,val);
         }
         if(root.val<val){
             root.right=insertIntoBST(root.right,val);
         }
         return root;
    }
}

四、删除二叉搜索树中的节点

题目链接力扣405

做题思路:该题也是采用递归的方法,但是有好几种情况,豆得考虑清楚先,

1.不存在目标节点

2.当左孩子和右孩子都为空

3.当左孩子为空右孩子不为空

4.当左孩子不为空,右孩子为空

5.左孩子和右孩子都不为空的情况(这是最复杂的情况,得改变二叉搜索树得结构) 详细步骤,

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;
           root=root.right;
             return root;
           }
         
       }
       if(root.val>key) root.left= deleteNode(root.left,key);
       if(root.val<key) root.right= deleteNode(root.right,key);
       return root;
    
    }
}

 

### IntelliJ IDEA 中通义灵码 AI 功能介绍 IntelliJ IDEA 提供了一系列强大的工具来增强开发体验,其中包括通义灵码 AI 相关的功能。这些功能可以帮助开发者更高效地编写代码并提高生产力。 #### 安装通义灵码插件 为了使用通义灵码的相关特性,在 IntelliJ IDEA 中需要先安装对应的插件: 1. 打开 **Settings/Preferences** 对话框 (Ctrl+Alt+S 或 Cmd+, on macOS)。 2. 导航到 `Plugins` 页面[^1]。 3. 在 Marketplace 中搜索 "通义灵码" 并点击安装按钮。 4. 完成安装后重启 IDE 使更改生效。 #### 配置通义灵码服务 成功安装插件之后,还需要配置通义灵码的服务连接信息以便正常使用其提供的各项能力: - 进入设置中的 `Tools | Qwen Coding Assistant` 菜单项[^2]。 - 填写 API Key 和其他必要的认证参数。 - 测试连接以确认配置无误。 #### 使用通义灵码辅助编程 一旦完成上述准备工作,就可以利用通义灵码来进行智能编码支持了。具体操作如下所示: ##### 自动补全代码片段 当输入部分语句时,IDE 将自动提示可能的后续逻辑,并允许一键插入完整的实现方案[^3]。 ```java // 输入 while 循环条件前半部分... while (!list.isEmpty()) { // 激活建议列表选择合适的循环体内容 } ``` ##### 解释现有代码含义 选中某段复杂的表达式或函数调用,右键菜单里会有选项可以请求通义灵码解析这段代码的作用以及优化意见。 ##### 生产测试案例 对于已有的业务逻辑模块,借助于通义灵码能够快速生成单元测试框架及初始断言集,减少手动构建的成本。 ```python def test_addition(): result = add(2, 3) assert result == 5, f"Expected 5 but got {result}" ```
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值