二叉树的所有路径
难度:
标签:
题目描述
给你一个二叉树的根节点 root
,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
示例 1:

输入:root = [1,2,3,null,5] 输出:["1->2->5","1->3"]
示例 2:
输入:root = [1] 输出:["1"]
提示:
- 树中节点的数目在范围
[1, 100]
内 -100 <= Node.val <= 100
代码结果
运行时间: 32 ms, 内存: 15 MB
/*
* 思路:
* 1. 使用递归和流来实现深度优先搜索。
* 2. 如果当前节点是叶子节点,将路径加入结果。
* 3. 如果当前节点有左或右子节点,递归调用,并连接路径。
*/
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class Solution {
public List<String> binaryTreePaths(TreeNode root) {
if (root == null) return new ArrayList<>();
return dfs(root).collect(Collectors.toList());
}
private Stream<String> dfs(TreeNode node) {
if (node.left == null && node.right == null) {
return Stream.of(Integer.toString(node.val));
}
return Stream.concat(
node.left != null ? dfs(node.left).map(p -> node.val + "->" + p) : Stream.empty(),
node.right != null ? dfs(node.right).map(p -> node.val + "->" + p) : Stream.empty()
);
}
}
解释
方法:
该题解使用深度优先搜索(DFS)的方式遍历二叉树。从根节点开始,递归地遍历左右子树,并在遍历过程中维护一个路径数组path。当遇到叶子节点时,将当前路径加入结果数组result中。遍历完一条路径后,需要回溯,即从path中移除当前节点,继续遍历其他路径。
时间复杂度:
O(n*h),其中n为节点数,h为树的高度。最坏情况下O(n^2),最好情况下O(n*log(n))。
空间复杂度:
O(n),其中n为节点数。
代码细节讲解
🦆
为何在遍历完一个节点的左右子树后,需要对path进行回溯(即pop操作)?
▷🦆
在DFS遍历中,您如何确保`path`列表在递归的每一层中正确地表示从根节点到当前节点的路径?
▷🦆
给定二叉树的节点值可以是负数,这是否对生成路径字符串或结果存储有任何特殊影响?
▷🦆
在您的算法中,是否考虑了二叉树可能存在只有一个节点(即根节点也是叶子节点)的情况?如果有,代码是如何处理这种情况的?
▷相关问题
路径总和 II
给你二叉树的根节点 root
和一个整数目标和 targetSum
,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
叶子节点 是指没有子节点的节点。
示例 1:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22 输出:[[5,4,11,2],[5,8,4,5]]
示例 2:

输入:root = [1,2,3], targetSum = 5 输出:[]
示例 3:
输入:root = [1,2], targetSum = 0 输出:[]
提示:
- 树中节点总数在范围
[0, 5000]
内 -1000 <= Node.val <= 1000
-1000 <= targetSum <= 1000
从叶结点开始的最小字符串
给定一颗根结点为 root
的二叉树,树中的每一个结点都有一个 [0, 25]
范围内的值,分别代表字母 'a'
到 'z'
。
返回 按字典序最小 的字符串,该字符串从这棵树的一个叶结点开始,到根结点结束。
注:字符串中任何较短的前缀在 字典序上 都是 较小 的:
- 例如,在字典序上
"ab"
比"aba"
要小。叶结点是指没有子结点的结点。
节点的叶节点是没有子节点的节点。
示例 1:
输入:root = [0,1,2,3,4,3,4] 输出:"dba"
示例 2:
输入:root = [25,1,3,1,3,0,2] 输出:"adz"
示例 3:
输入:root = [2,2,1,null,1,0,null,0] 输出:"abc"
提示:
- 给定树的结点数在
[1, 8500]
范围内 0 <= Node.val <= 25