LeetCode每日1题--二叉树的所有路径

简介: LeetCode每日1题--二叉树的所有路径

前言


算法的重要性不言而喻!区分度高!

现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,学一些底层和基础的东西。

说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!

提前入门学习书籍:CPrimerPlus、大话数据结构

image.png


刷题网站


代码随想录 (programmercarl.com)

leetcode

我是按照代码随想录提供的刷题顺序进行刷题的,大家也可以去刷leetcode最热200道,都可以

刷题嘛,最重要的就是坚持了!!!


画图软件


OneNote

这个要经常用,遇见不懂的流程的话就拿它画一画!


笔记软件


Typoral


题目


image.png


解析


确定思路

题目要求的是根节点到叶子结点的路径,所以要从根节点开始,那么我们就需要用前序遍历。

除了确认前序遍历,我们今天还要新了解一个概念;那就是回溯!什么是回溯呢?由于是第一次出现这个词语我们没必要深究。举个例子给大家理解:

  1. 就比如这道题,找到父节点到叶子结点的路径之后,还需要清空这个顺序
  2. 清空顺序这个过程其实就是回溯的过程

ok,就了解这么多后面我们有专门的专题去练习回溯。

计算路径

下面的这个路径该怎么表示呢?


["1->2->5","1->3"]

很明显它是一个字符串集合,字符是节点的数值加上一个"->"标识

那我们不是只要把节点的值取出来然后再加上这个->标识不就行了吗?

对,没错! 但是有一个注意点,如果我们把每个节点的值拿出来之后加上这个->标识,那这个字符串整体不就变成了1->2->5->这样了吗?我们想要的是1->2->5这样的啊喂!

怎么解决呢?

我们可以先不把最后一个元素加入这个字符串中,等待倒数第二个加完我们就结束,最后一个字符我们手动添加不就行了?

就是这个意思:当我们添加到1->2->这样之后就停止添加;最后我们在添加最后一个节点的元素值.这样就可以实现1->2->5这样的效果了!

具体代码如下:


//把每个节点的值添加进字符串中
paths.add(root.val);
//递归到了叶子结点,开始计算路径
if(root.left == null && root.right == null){
    StringBuilder sb =  new StringBuilder();
    //i< paths.size() - 1这里不遍历到最后一个元素,是因为“->”的原因
    //最后一个元素我们手动加入
    for(int i = 0;i< paths.size() - 1;i++){
        sb.append(paths.get(i)).append("->");
    }
    sb.append(paths.get(paths.size() -1));
    res.add(sb.toString());
    return;
}

回溯的过程

第一条路径搞好了,我们还要添加第二条路径呢,但是paths这个集合里,存放的都是第一条路径的节点值,所以我们需要把它们给全部取出来!这就是回溯的过程!

可以发现,递归往往都是和回溯相伴!

递归是直接干到最后一个节点,然后慢慢往上走.

回溯自然也是从最后一个节点,然后慢慢踢出节点的值


if(root.left != null){
    traversal(root.left,paths,res);
    paths.remove(paths.size() - 1);//回溯的过程
}
if(root.right != null){
    traversal(root.right,paths,res);
    paths.remove(paths.size() -1 );//回溯
}

完整代码如下


class Solution {
    public List<String> binaryTreePaths(TreeNode root) {
        //存放的路径结果集
        List<String> res = new ArrayList<>();
        //边界条件判断
        if(root == null){
            return res;
        }
        //存放节点的值
        List<Integer> paths = new ArrayList<>();
        traversal(root,paths,res);
        return res;
    }
    //计算二叉树的所有路径,并回溯
    private void traversal(TreeNode root,List<Integer> paths, List<String> res){
        paths.add(root.val);
        //递归到了叶子结点,开始计算路径
        if(root.left == null && root.right == null){
            StringBuilder sb =  new StringBuilder();
            //i< paths.size() - 1这里不遍历到最后一个元素,是因为“->”的原因
            //最后一个元素我们手动加入
            for(int i = 0;i< paths.size() - 1;i++){
                sb.append(paths.get(i)).append("->");
            }
            sb.append(paths.get(paths.size() -1));
            res.add(sb.toString());
            return;
        }
        if(root.left != null){
            traversal(root.left,paths,res);
            paths.remove(paths.size() - 1);//回溯的过程
        }
        if(root.right != null){
            traversal(root.right,paths,res);
            paths.remove(paths.size() -1 );//回溯
        }
    }
}

测试

image.png



相关文章
|
2月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
45 6
|
2月前
|
存储 算法
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
文章深入探讨了二叉树的层序遍历方法,并展示了如何通过队列实现层序遍历的算法逻辑,同时指出掌握层序遍历技巧可以帮助解决LeetCode上的多道相关题目。
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
|
2月前
|
算法 Java
LeetCode第94题二叉树的中序遍历
文章介绍了LeetCode第94题"二叉树的中序遍历"的解法,使用递归实现了中序遍历的过程,遵循了"左根右"的遍历顺序,并提供了清晰的Java代码实现。
LeetCode第94题二叉树的中序遍历
|
2月前
|
存储 算法 Linux
LeetCode第71题简化路径
文章讲述了LeetCode第71题"简化路径"的解题方法,利用栈的数据结构特性来处理路径中的"."和"..",实现路径的简化。
LeetCode第71题简化路径
|
2月前
|
算法
LeetCode第64题最小路径和
LeetCode第64题"最小路径和"的解题方法,运用动态规划思想,通过构建一个dp数组来记录到达每个点的最小路径和,从而高效求解。
LeetCode第64题最小路径和
|
2月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
40 7
|
2月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - II. 从上到下打印二叉树 II
本文提供了一种Python实现方法,用于层次遍历二叉树并按层打印结果,每层节点按从左到右的顺序排列,每层打印到一行。
30 3
|
2月前
|
算法 JavaScript Python
【Leetcode刷题Python】79. 单词搜索和剑指 Offer 12. 矩阵中的路径
Leetcode第79题"单词搜索"的Python解决方案,使用回溯算法在给定的二维字符网格中搜索单词,判断单词是否存在于网格中。
25 4
|
2月前
|
存储 Python
【Leetcode刷题Python】滑雪路径消耗时间:Testing Round #16 (Unrated) C. Skier
Leetcode题目"Testing Round #16 (Unrated) C. Skier"的Python解决方案,题目要求计算给定滑雪路径字符串的总耗时,其中未走过的边耗时5秒,走过的边耗时1秒。
39 4
|
2月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - I. 从上到下打印二叉树
本文介绍了使用Python实现从上到下打印二叉树的解决方案,采用层次遍历的方法,利用队列进行节点的访问。
30 2