11.二叉树的所有路径

1.题目链接:

257. 二叉树的所有路径 - 力扣(LeetCode)257. 二叉树的所有路径 - 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。叶子节点 是指没有子节点的节点。 示例 1:[https://assets.leetcode.com/uploads/2021/03/12/paths-tree.jpg]输入:root = [1,2,3,null,5]输出:["1->2->5","1->3"]示例 2:输入:root = [1]输出:["1"] 提示: * 树中节点的数目在范围 [1, 100] 内 * -100 <= Node.val <= 100https://leetcode.cn/problems/binary-tree-paths/description/

2.题目描述:

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

叶子节点:是指没有子节点的节点。

示例1:

         输入:root = [1,2,3,null,5]​
         输出:["1->2->5","1->3"]​

示例2:

    输入:root = [1]​


         输出:["1"]​

提示:

                   树中节点的数目在范围 [1, 100] 内​
                   -100 <= Node.val <= 100​

3.解法(回溯):

算法思路:

使用深度优先遍历(DFS)求解。​
路径以字符串形式存储,从根节点开始遍历,每次遍历时将当前节点的值加入到路径中,如果该节点为叶子节点,将路径存储到结果中。否则,将 "->" 加入到路径中并递归遍历该节点的左右子树。​定义一个结果数组,进行递归。递归具体实现方法如下:
1. 如果当前节点不为空,就将当前节点的值加入路径 path 中,否则直接返回;​
2. 判断当前节点是否为叶子节点,如果是,则将当前路径加入到所有路径的存储数组 paths 中;

3. 否则,将当前节点值加上 "->" 作为路径的分隔符,继续递归遍历当前节点的左右子节点。​

4. 返回结果数组。

特别地,我们可以只使用一个字符串存储每个状态的字符串,在递归回溯的过程中,需要将路径中的当前节点移除,以回到上一个节点。

具体实现方法如下:
1. 定义一个结果数组和一个路径数组。

2. 从根节点开始递归,递归函数的参数为当前节点、结果数组和路径数组。

                                                    a. 如果当前节点为空,返回。

                                                    b. 将当前节点的值加入到路径数组中。​
                                                    c. 如果当前节点为叶子节点,将路径数组中的所有元素拼接成字符串,并将该字符串存储到结果  数组中。

d. 递归遍历当前节点的左子树。​
e. 递归遍历当前节点的右子树。

                                                    f. 回溯,将路径数组中的最后一个元素移除,以返回到上一个节点。

3. 返回结果数组。

Java算法代码:

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

运行结果:

递归展开:

请注意这里为什么new StringBuffer而不是,使用一个全局变量呢?
简单说,只要得到过就能存储(当遍历到底,得到了一条完整路径,直接存储ret(这个是全局的)。
因为是局部变量,所以在一次函数调用结束(既得到了完整路径(暂存)--》ret),又没有改变原本的path。也就是说,帮我们进行回溯了。或者说是避免了回溯。
 

逻辑展开:

这道题的细节:回溯体现在哪里呢??你发现自己好像什么都没做?

但是代码中的这个一个全局变量ret和一个局部变量的设计,需要读者去好好的体会。

---------------------------------------------------------------------------------------------------------------------------------

记住,相信你的递归函数,它可以做到!

记住,不理解时候,去尝试手动展开!

记住,逻辑展开(你不可能对所有的题目都进行手动展开)!

1. 二叉树的递归遍历: 二叉树的递归遍历是指通过递归方法遍历二叉树的各个节点,按照某种次序访问每个节点。常见的二叉树遍历方式有前序遍历、中序遍历和后序遍历。 2. 二叉树的非递归遍历: 二叉树的非递归遍历是指通过循环等非递归方法遍历二叉树的各个节点,按照某种次序访问每个节点。非递归遍历需要借助栈来实现,常见的二叉树遍历方式有前序遍历、中序遍历和后序遍历。 3. 二叉树的层次遍历: 二叉树的层次遍历是指按照从上到下、从左到右的顺序遍历每一层节点。常用的方法是使用队列来实现,首先将根节点入队列,然后依次出队列,并将其左右子节点入队列,直到队列为空。 4. 输出二叉树上所有叶节点: 二叉树上的叶节点是指没有子节点的节点。可以通过递归方式,对每个节点进行判断,如果该节点没有左右子节点,则将该节点输出。 5.二叉树的高度: 二叉树的高度是指从根节点到叶节点最长路径上经过的边数。可以通过递归方式求解,从左右子中选取较大的一个加上根节点即可。 6. 二叉树层序生成算法二叉树层序生成算法是指按照从上到下、从左到右的顺序依次生成每个节点。可以使用队列来实现,首先将根节点入队列,然后依次出队列,并根据当前节点生成其左右子节点,将其入队列,直到生成完所有节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值