二叉搜索树,穷举(全排列)

news2024/9/25 5:23:40

力扣230.二叉搜索树中第K小的元素

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int count=Integer.MAX_VALUE;
    int ret=0;
    //可以尝试中序遍历,然后用数组去存储
    //两个全局变量,用中序遍历,然后再去计数
    public int kthSmallest(TreeNode root, int k) {
        count=k;
       dfs(root);
     return ret;
    }
 public void dfs(TreeNode root){
        //处理了剪枝的情况
    if(root==null||count==0){
        //提前退出的意思
            return ;
            }
    dfs(root.left);
    //修改计数器,注意一个不好理解的地方,count--写一个就够,他不是循环,两个改变就要写两个,要考虑递归的思想,我本人确实现在还没有那个思想,但是会慢慢努力
    count--;
    //剪枝
    if(count==0){
        ret=root.val;
    }
    if(count==0){
     return ;}
//右子树重新递归的时候,会走那个count--,因为假如没有左子树,那么count 不变
    dfs(root.right);
    }
}

力扣257.二叉树的所有路径

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
     List <String>ret;
    public List<String> binaryTreePaths(TreeNode root) {
           dfs(root,new StringBuffer()); //传递的相当于是一个全局的StringBuffer
           return ret;

    }
    //回溯:恢复现场,只要有递归,必然就有回溯,简单题中
    public void dfs(TreeNode root,StringBuffer _path){
//定义个变量,这样他回溯的时候,他不会影响那个_path,
        StringBuffer path=new StringBuffer(_path);
//path加入root.val相当于保存当前节点的值
        path.append(Integer.toString(root.val));
        if(root.left==null&&root.right==null){
//到了叶子结点,那么路径的就基本已经出来了,所以要把他添加到ret里面,然后
           ret.add(path.toString());
           return;
        }
//path加入这个->箭头,所有的修改都是在path这个地方修改
        path.append("->");
//这里传递的是path,而不是_path,因为_path已经存储了。而path没有存储,path还停留在根节点应该有的地方
      if(root.left!=null) dfs(root.left,path);
      if(root.right!=null)dfs(root.right,path);
    }
}

回溯的用途就是递归后返回。剪枝的用途就是为了节省时间,如果某种情况不合格,就无须遍历其他节点。

力扣46.全排列

​​​​​​​

如果全部使用for循环会很难解决,所以选择使用递归。

1.画出决策树,越详细越好(决策树:如何不从不漏的全部遍历一遍)

  • res.add(list)为浅拷贝,后续list内容的变化会导致res的变化,在原来地址改变数据,内容肯定会被改变
  • res.add(new ArrayList(list))为深拷贝,对象中开辟一个新地址,存放的内容为list链表,所以后续不会被影响。

解释了什么是深拷贝,什么是浅拷贝

记住一件事,写算法,dfs不要套模版,套模版只会局限你的思维,这次我是很深的感受到,套代码这几个题,我都没有很好的思考出来。

class Solution {
    List<List<Integer>> ret=new ArrayList<>();
    List<Integer>path=new ArrayList<>();
    boolean[]check;
    public List<List<Integer>> permute(int[] nums) {
     check=new boolean[nums.length];
//这一步也不好想,为什么只穿一个数组,我刚开始是想传一个数组,再加上一个i,j,k标记到了第几个数字,我们只需判断path的长度是否等于nums的长度即可
     dfs(nums);
     return ret;
    }
public void dfs(int []nums){
    //出口
    if(path.size()==nums.length){
        //深拷贝,不影响path这个东西。
    ret.add(new ArrayList<>(path));
    return ;}
    for(int i=0;i<nums.length;i++){
        if(check[i]==false){
            //添加
            path.add(nums[i]);
            //标记一遍
            check[i]=true;
            //dfs进入下一层
            dfs(nums);
            //回溯->恢复现场 当dfs回来之后,把check恢复原来位置
            check[i]=false;
            //回溯减少一个,
            path.remove(path.size()-1);
        }
    }
    }
}

力扣78.子集

步骤一:先画决策树 

2.设计代码

全局变量

dfs()

细节问题

class Solution {
    List<List<Integer>>ret=new ArrayList<>();
    List<Integer>path=new ArrayList<>();
    public List<List<Integer>> subsets(int[] nums) {
    dfs(nums,0);
    return ret;
    }
//整个代码实现,我认为最难的部分在于怎么去写选和不选部分
    public void dfs(int[]nums,int i){
    if(i==nums.length){
        ret.add(new ArrayList<>(path));
        return;
    }
     
    //选,如果你要选,就要先添加,然后进入递归
    path.add(nums[i]);
    dfs(nums,i+1);

//    path.remove(nums[i+1]);
//这里去除也是细节,为神马不是上面那个去除,因为上面的去除,面临越界的事情,但是假如你是原有的path.remove就会去除下标为size-1这个位置的结果,因为他是数组。
path.remove(path.size()-1);
    //不选
    dfs(nums,i+1);
    }
}

他是根据下标删除

解法2:我们for循环遍历的是下标

class Solution {
    List<List<Integer>>ret=new ArrayList<>();
    List<Integer>path=new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
    dfs(nums,0);
    return ret;
    }
public void dfs(int[]nums,int pos){
   //这一步很细节,开始在想,他怎么才能是空,后来发现把path当成别的东西了,假如一开始添加他就,那他就是一个空的.
   ret.add(new ArrayList<>(path));
   //i=pos,这一步是为了让他到达pos的地方,也就是到达了第几层
  // 这个for表示的是让决策树横着走
   for(int i=pos;i<nums.length;i++){
      path.add(nums[i]);
//注意这里是i+1,还是pos+1,因为他的i从i的下一个位置开始依次枚举,假如是pos会出现什么结果呢,假如说是pos,当i从1变成2的时候pos是不改变的,换句话说,他还会再往下重复走一块,为什么是i+1,就是因为不让他重复走,这个dfs是表示让决策树往下走,假如是只有2的话,那个i=0,然后pos=1,ret加入这个2,此时i页=1,path又去加这个i,此时他就是22,然后再次进入,那么就ret 就进入了22,所以pos是不正确的,那么假如是i的话,就会往下递归正常的顺序。
      dfs(nums,i+1);
      path.remove(path.size()-1);
   }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1415164.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Doris安装部署文档

简介 网址&#xff1a;Apache Doris: Open-Source Real-Time Data Warehouse - Apache Doris Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库&#xff0c;以极速易用的特点被人们所熟知&#xff0c;仅需亚秒级响应时间即可返回海量数据下的查询结果&#xff…

mac配置L2TP连接公司内网

1. 打开系统设置 2. 打开网络 3. 点击网络页面其他服务右下角三个点&#xff0c;添加VPN配置中的L2TP 4. 配置VPN&#xff0c;服务器填写公司的服务器ip&#xff0c;共享密钥没有可以随便填写 5. 打开终端编辑文件 sudo vim /etc/ppp/opt…

Java笔记 --- 三、方法引用

三、方法引用 概述 分类 引用静态方法 引用成员方法 本类中注意&#xff0c;静态方法中没有this&#xff0c;需要创建本类的对象 引用构造方法 其他的调用方式 使用类名引用成员方法 引用数组的构造方法

spring整合mybatis的底层原理

spring整合mybatis的底层原理 原理&#xff1a; FactoryBean的自定义对象jdk动态代理Mapper接口对象 一、手写一个spring集成mybatis 目录结构&#xff1a; 1.1 入口类 public class Test {public static void main(String[] args) {AnnotationConfigApplicationContext co…

Java基于 SpringBoot+Vue 的高校心理教育辅导系统的研究与实现

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

智能工厂4G无线设备预测维护云端联动的DI、AI、DO混合信号处理单元

在现代工业智能化进程中&#xff0c;一款集成了丰富I/O接口并能与各大云平台无缝对接的智能设备显得尤为重要。比如最近推出的这款创新产品&#xff0c;它集合了8路数字输入通道&#xff0c;涵盖了干湿节点的识别功能&#xff0c;适用于多种开关量信号的读取&#xff1b;同时&a…

B端系统优化:用好卡片式设计,效果立竿见影翻倍。

B端系统中&#xff0c;卡片式设计是一种常见的界面设计风格&#xff0c;它将信息和功能组织成一系列独立的卡片&#xff0c;每个卡片通常包含一个特定的信息块或功能模块。 一、卡片式设计的特点包括&#xff1a; 模块化和可重用性&#xff1a;卡片可以被独立设计和开发&#…

svg 属性详解:填充与边框

svg 属性详解&#xff1a;填充与边框 1 颜色和透明度2 填充规则 fill-rule3 边框样式3.1 stroke-width3.2 stroke-linecap3.3 stroke-linejoin3.4 stroke-dasharray 1 颜色和透明度 图像都有颜色&#xff0c;svg 中可以使用属性 fill 和 stroke 来修改图形的颜色。fill 属性设置…

第十六讲_HarmonyOS应用程序包介绍

HarmonyOS应用程序包介绍 1. 应用程序包概述1.1 多 Module 设计的好处1.2 Module 的类型 2. 应用程序包结构2.1 应用的配置文件2.2 资源目录 3. 应用程序编译后包结构 1. 应用程序包概述 官方推荐基于Stage模型开发HarmonyOS应用程序&#xff0c;一个应用可以包含一个或多个Mo…

计算机基础之微处理器简介

微处理器 微处理器定义 微型计算机的CPU也被称为微处理器&#xff0c;是将运算器、控制器和高速缓存集成在一起的超大规模集成电路芯片&#xff0c;是计算机的核心部件。能完成取指令、执行指令&#xff0c;以及与外界存储器和逻辑部件交换信息等操作。 微处理器发展 CPU从…

研发日记,Matlab/Simulink避坑指南(七)——数据溢出钳位Bug

文章目录 前言 背景介绍 问题描述 分析排查 解决方案 总结归纳 前言 见《研发日记&#xff0c;Matlab/Simulink避坑指南(二)——非对称数据溢出Bug》 见《研发日记&#xff0c;Matlab/Simulink避坑指南(三)——向上取整Bug》 见《研发日记&#xff0c;Matlab/Simulink避坑…

【CSS】实现鼠标悬停图片放大的几种方法

1.背景图片放大 使用css设置背景图片大小100%&#xff0c;同时设置位置和过渡效果&#xff0c;然后使用&#xff1a;hover设置当鼠标悬停时修改图片大小&#xff0c;实现悬停放大效果。 <!DOCTYPE html> <html lang"en"> <head><meta charset…

C++大学教程(第九版)7.19 将7.10节vector对象的例子转换成array对象

文章目录 题目代码运行截图 题目 (将7.10节vector 对象的例子转换成array 对象)将图7.26中 vector 对象的例子转换成使用array 对象。请消除任何 vector 对象仅有的特性。 分析&#xff1a; vector对象独有的特性&#xff1a; 1.vector对象长度可变 2.长度不同的vector对象可…

基于springboot校友社交系统源码和论文

校友社交系统提供给用户一个校友社交信息管理的网站&#xff0c;最新的校友社交信息让用户及时了解校友社交动向,完成校友社交的同时,还能通过论坛中心进行互动更方便。本系统采用了B/S体系的结构&#xff0c;使用了java技术以及MYSQL作为后台数据库进行开发。系统主要分为系统…

为什么选择快速应用开发:提高业务响应速度与竞争力的关键

如今&#xff0c;企业想要持续蓬勃发展&#xff0c;就需要具备快速满足客户期望的能力。无论是十几年历史的重要市场占有者推出新的APP&#xff0c;还是在疫情期间从线下转向线上电商营销&#xff0c;企业都需要主动适应市场。随着为客户提供新的服务方式&#xff0c;员工也需要…

以前年度资产价值导入以及汇率自动计算解决方案

文章目录 1 Introduction2 Code3 Summary 1 Introduction In the example we will finish ABLDT function and modify asset value . 2 Code DATA: key TYPE bapi1022_key,generaldata TYPE bapi1022_feglg001,generaldatax TYPE bapi1…

品牌突围|内容营销「共创公式」全面讲解

为什么品牌要扎根小红书&#xff1f;除了种草投放&#xff0c;品牌还能做些什么&#xff1f; 在小红书&#xff0c;迎接消费者共创的时代&#xff0c;激活品牌营销的无限潜能。 拥抱多元 在新机遇中预见未来 2023年&#xff0c;各大社交媒体平台涌现出了许多热点&#xff0c…

keil使用教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据 总结 前言 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重…

jupyter python笔记杂乱

问题产生的原因: 无法执行sess.run()的原因是tensorflow版本不同导致的&#xff0c;tensorflow版本2.0无法兼容版本1.0 解决办法: tf.compat.v1.disable_eager_execution() 确保tf’2能运行tf1的代码 notebok打开指定文件夹 直接解决

代码随想录刷题笔记-Day12

1. 二叉树的递归遍历 144. 二叉树的前序遍历https://leetcode.cn/problems/binary-tree-preorder-traversal/94. 二叉树的中序遍历https://leetcode.cn/problems/binary-tree-inorder-traversal/145. 二叉树的后续遍历https://leetcode.cn/problems/binary-tree-postorder-tra…