Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >刷题训练之深搜(DFS)-----(二叉树的所有路径,全排列,子集)

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

作者头像
用户11369558
发布于 2024-11-20 07:12:22
发布于 2024-11-20 07:12:22
12000
代码可运行
举报
文章被收录于专栏:JavaJava
运行总次数:0
代码可运行

二叉树的所有路径

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

题目分析:

题目要我们找到一个课的所有路径,就是要找到从根节点到每一个叶子节点的路径 终止条件就是当遇到叶子节点的时候 用一个全局变量ret接收它此时的路径 并且返回给它上一次的路径 例如 拿节点5举例此时它还不为叶子节点 所以它需要继续往左树和右数寻找 此时找到叶子节点 1->2->5->7 得返回1->2->5回去(但是此题目可以省略,可以设计函数的时候直接传入俩个值) dfs(root,path) 此时path为当前路径 此题目需要频繁要在字符串后面添加字符“->” 可以使用 StringBuffer 可以自由在后面添加

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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) 函数体:仅需要关注某个节点做了什么事情

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 == 数组长度时 ,可以发现它就是最后一个节点了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    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);
        }
    }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-11-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
穷举vs暴搜vs深搜vs回溯vs剪枝专题一>子集
用户11305962
2025/01/13
460
穷举vs暴搜vs深搜vs回溯vs剪枝专题一>子集
刷题日常(找到字符串中所有字母异位词,​ 和为 K 的子数组​,​ 滑动窗口最大值​,全排列)
给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
用户11369558
2024/12/24
850
刷题日常(找到字符串中所有字母异位词,​ 和为 K 的子数组​,​ 滑动窗口最大值​,全排列)
穷举vs暴搜vs深搜vs回溯vs剪枝专题一>全排列II
用户11305962
2025/01/13
690
穷举vs暴搜vs深搜vs回溯vs剪枝专题一>全排列II
二叉树中和为某一值的路径
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
MickyInvQ
2021/12/07
4160
二叉树中和为某一值的路径
【LeetCode】--- 二叉树的所有路径
用户11288958
2025/01/24
630
【LeetCode】--- 二叉树的所有路径
二叉树题目合集
用递归法 ,传入左右两棵树的根节点 ,然后比较 left.left == right.left; 以及 left.right ==right.right;
用户11097514
2024/05/30
700
LeetCode-46-全排列
基本的思路想象成一个树的问题,是从一个数字(外层循环分别固定1,2,3数字)出发,往树的更深处遍历
benym
2022/07/14
1550
穷举vs暴搜vs深搜vs回溯vs剪枝系列一>组合
用户11305962
2025/01/13
570
穷举vs暴搜vs深搜vs回溯vs剪枝系列一>组合
穷举vs暴搜vs深搜vs回溯vs剪枝系列一>组合总和
用户11305962
2025/01/13
420
穷举vs暴搜vs深搜vs回溯vs剪枝系列一>组合总和
排列问题!
力扣题目链接:https://leetcode-cn.com/problems/permutations/
代码随想录
2021/10/19
6700
LeetCode-47-全排列2
之后构建递归树,因为返回的结果中不能包含重复的排列,所以在如数组1、1、2的排列过程中
benym
2022/07/14
1630
【剑指Offer】34. 二叉树中和为某一值的路径
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
瑞新
2020/12/07
2900
【剑指Offer】34. 二叉树中和为某一值的路径
二叉树刷题总结:二叉树的属性
这就需要去判断根节点下左子树与右子树里侧和外侧是否相等。比较的方法是拿左子树的 “左-右-中” 节点和右子树的“右-左-中”为顺序的节点做比较。
HelloWorld杰少
2022/08/04
3470
二叉树刷题总结:二叉树的属性
面试必备:回溯算法详解
我们刷leetcode的时候,经常会遇到回溯算法类型题目。回溯算法是五大基本算法之一,一般大厂也喜欢问。今天跟大家一起来学习回溯算法的套路,文章如果有不正确的地方,欢迎大家指出哈,感谢感谢~
捡田螺的小男孩
2022/02/10
6230
面试必备:回溯算法详解
排列问题也要去重了!
力扣题目链接:https://leetcode-cn.com/problems/permutations-ii
代码随想录
2021/10/19
6200
DFS:深搜+回溯+剪枝解决排列、子集问题
排列和子集问题就总结到这啦!!回溯有关的题关键就是画树状图,然后根据树状图去思考怎么进行深搜、回溯和剪枝!!
小陈在拼命
2024/04/04
1260
DFS:深搜+回溯+剪枝解决排列、子集问题
回溯总结
回溯, 简单来说也就是暴力算法, 之前在学习二叉树 和 递归算法的时候, 我们都涉及到了回溯, 只是没有深究而已, 对于回溯而言,他本身就是将所有的结果穷举出来, 所以我们这里说回溯就是暴力算法。 在跟随《代码随想录》的学习中, 将回溯算法拆分为了以下几个模块来学习
用户11097514
2024/05/31
1140
回溯总结
二叉树篇二刷总结
二叉树篇,我们总共做了有关二叉树的遍历方式、求解二叉树的属性、对二叉树的修改以及构造等这几类的题型, 总结下来就是对二叉树的各种遍历方式的不同程度应用。
用户11097514
2024/05/31
940
二叉树篇二刷总结
二叉树的所有路径:不止递归,还有回溯
题目地址:https://leetcode-cn.com/problems/binary-tree-paths/
代码随想录
2021/08/10
1.4K0
LeetCode通关:连刷十四题,回溯算法完全攻略
例如我们在查找二叉树所有路径的时候,查找完一个路径之后,还需要回退,接着找下一个路径。
三分恶
2021/09/23
9830
LeetCode通关:连刷十四题,回溯算法完全攻略
相关推荐
穷举vs暴搜vs深搜vs回溯vs剪枝专题一>子集
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文