刷题训练之深搜(DFS)-----(二叉树的所有路径,全排列,子集)

embedded/2024/11/20 7:36:25/

二叉树的所有路径

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

 题目分析:

题目要我们找到一个课的所有路径,就是要找到从根节点到每一个叶子节点的路径

终止条件就是当遇到叶子节点的时候 用一个全局变量ret接收它此时的路径 并且返回给它上一次的路径 

例如 拿节点5举例此时它还不为叶子节点 所以它需要继续往左树和右数寻找 此时找到叶子节点 1->2->5->7 得返回1->2->5回去(但是此题目可以省略,可以设计函数的时候直接传入俩个值)

dfs(root,path) 此时path为当前路径 

此题目需要频繁要在字符串后面添加字符“->” 可以使用 StringBuffer 可以自由在后面添加

class Solution {List<String> ret = new ArrayList<>();public List<String> binaryTreePaths(TreeNode root) {dfs(root,new StringBuffer());return ret;}public void dfs(TreeNode root,StringBuffer s) {StringBuffer path = new StringBuffer(s);if(root == null) {return;}path.append(Integer.toString(root.val));if(root.left == null && root.right == null) {ret.add(path.toString());return ;}path.append("->");dfs(root.left,path);dfs(root.right,path);}
}

 全排列

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 

题目分析:  

 全排序:将一组数字以不同的顺序组合起来,一组数字里面不能重复使用,看看能有多少种

先判断何为出口?

当遇到叶子节点时候,使用全局变量ret直接添加结果

此时的叶子节点 相当于路径path的大小 是否等于数组的大小

细节:

因为不能使用重复的数字,所有需要一个Boolean数组来记录它们的状态 如果使用了将它记录为true(已使用)

回溯:

当添加完后,返回给上一层时候,需要把path最后一个数字删除,并且恢复改数字的状态为false(未使用)


dfs(nums)

函数体:仅需要关注某个节点做了什么事情

class Solution {List<List<Integer>> ret;List<Integer> path;boolean[] check;public List<List<Integer>> permute(int[] nums) {ret = new ArrayList<>();path = new ArrayList<>();check = new boolean[nums.length];dfs(nums);return ret;}void dfs(int[] nums) {if(path.size() == nums.length) {ret.add(new ArrayList<>(path));}for(int i = 0;i<nums.length;i++) {if(check[i] == false) {path.add(nums[i]);check[i] = true;dfs(nums);path.remove(path.size()-1);check[i] = false;}}}
}

子集

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的

子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

题目分析:

×代表不选 √代表选择 

此题目可以抽象成 选 和 不选 俩种情况看待

1.选  直接添加到path路径 并且进入下一次递归 回退过程中并且删除最后一个数字

2.不选 直接递归

 设计函数头 dfs(nums,index)

index标记此时在nums中哪个数字

终止条件:

当遇到到叶子节点的时候 用一个全局变量ret接收

 当 index == 数组长度时 ,可以发现它就是最后一个节点了

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;}void dfs(int[] nums,int index) {if(index == nums.length) {ret.add(new ArrayList<>(path));return ;}//不选dfs(nums,index+1);//选path.add(nums[index]);dfs(nums,index+1);path.remove(path.size()-1);}
}

解法二: 

 

 函数头设计 dfs(nums,index)

此时的递归出口 将三个数字遍历完成就行

何时添加到ret中?

一进入到dfs中,就可以一直添加path 

    List<List<Integer>> ret = new ArrayList<>();List<Integer> path = new ArrayList<>();public List<List<Integer>> subsets(int[] nums) {dfs(nums,0);return ret;}void dfs(int[] nums,int index) {ret.add(new ArrayList<>(path));for(int i = index;i<nums.length;i++) {path.add(nums[i]);dfs(nums,i+1);path.remove(path.size()-1);}}

http://www.ppmy.cn/embedded/139008.html

相关文章

【RabbitMQ】10-抽取MQ工具

1. Nacos共享配置 shared-mq.yaml spring:rabbitmq:host: ${hm.mq.host:*.*.*.*} # 你的虚拟机IPport: ${hm.mq.port:5672} # 端口virtual-host: ${hm.mq.vhost:/hmall} # 虚拟主机username: ${hm.mq.un:hmall} # 用户名password: ${hm.mq.pw:***} # 密码2. Common包下引入依…

Flutter开发者进阶:接入安卓原生页面

Flutter开发者进阶&#xff1a;接入安卓原生页面 前言 在 Flutter APP 的开发过程中&#xff0c;有时不仅需要使用 Flutter 提供的组件&#xff0c;还需要使用原生的组件。 例如在对接外部 SDK 时&#xff0c;如果自己重新实现 SDK 的逻辑&#xff0c;无疑是本末倒置。 在这…

多邻国网页版怎么登录?

我之前一直用APP&#xff0c;最近才发现还有多邻国网页版&#xff0c;感觉网页版的多邻国使用感觉比APP舒服好多&#xff0c;而且很多功能只有网页版才有&#xff0c;多邻国网页版登录其实很简单&#xff0c;直接在官网www.duolingo.cn登录就可以。 一、多邻国是什么&#xff1…

Java项目实战II基于微信小程序的私家车位共享系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在城市化进…

算法——环形链表(leetcode141)

判断一个链表是否是环形链表&#xff0c;这题可以用快慢指针来解决&#xff0c;首先令快慢指针fastIndex、slowIndex等于head头节点,接着来一个循环 循环体是fastIndex步进两个单位slowIndex步进一个单位判断如果slowIndex等于fastIndex则是有环 因为fastIndex走的比slowIndex快…

华为VPN技术

1.启动设备 2.配置IP地址 [FW1]int g1/0/0 [FW1-GigabitEthernet1/0/0]ip add 192.168.1.254 24 [FW1-GigabitEthernet1/0/0]int g1/0/1 [FW1-GigabitEthernet1/0/1]ip add 100.1.1.1 24 [FW1-GigabitEthernet1/0/1]service-manage ping permit [FW2]int g1/0/0 [FW2-Gi…

MFC线程

一 、AfxBeginThread AfxBeginThread 是 MFC&#xff08;Microsoft Foundation Classes&#xff0c;微软基础类库&#xff09;中用于创建一个新线程的函数。它返回一个指向 CWinThread 类对象的指针&#xff0c;通过这个指针可以对创建出来的线程进行后续的操作和控制。 CWinT…

k-近邻算法(K-Nearest Neighbors, KNN)详解:机器学习中的经典算法

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…