Leetcode257.二叉树的所有路径 Binary Tree Paths(Java)
##Tree##, ##Depth-first Search##
二叉树的所有路径
使用DFS、回溯法解决,采用前序遍历
- 为减少创建对象的开销,使用
ArrayList<Integer> path
存储正在遍历的分支种已经被遍历过的结点 - 每遍历一个新的结点,就将该结点加入到
path
的末尾中- 该结点是叶子结点,根据
path
种存储的元素,生成解字符串,加入到结果集合中 - 该结点不是叶子结点,递归遍历其所有的非空儿子结点
- 该结点是叶子结点,根据
path
中每加入一个结点,在遍历完包含该结点的分支后,都需要恢复现场,path
中删除该结点值
时间复杂度: O(n^2)
考虑一棵如下图所示的二叉树,叶子结点的路径长度分别为2,3,4,…,共有n/2
个叶子结点,时间复杂度到达O(n^2)
class Solution {
List<String> res = new ArrayList<>();
ArrayList<Integer> path = new ArrayList<>();
public List<String> binaryTreePaths(TreeNode root) {
if (root == null) return res;
dfs(root);
return res;
}
public void dfs(TreeNode root) {
path.add(root.val);
if (root.left == null && root.right == null) {
StringBuilder sb = new StringBuilder();
sb.append(path.get(0));
for (int i = 1; i < path.size(); i ++) sb.append("->").append(path.get(i));
res.add(sb.toString());
path.remove(path.size() - 1);
return;
}
if (root.left != null) dfs(root.left);
if (root.right != null) dfs(root.right);
path.remove(path.size() - 1);
}
}