题目链接
257. 二叉树的所有路径
题目描述
解题思路
最直观的方法是使用深度优先搜索。在深度优先搜索遍历二叉树时,我们需要考虑当前的节点以及它的孩子节点。
- 如果当前节点不是叶子节点,则在当前的路径末尾添加该节点,并继续递归遍历该节点的每一个孩子节点。
- 如果当前节点是叶子节点,则在当前路径末尾添加该节点后我们就得到了一条从根节点到叶子节点的路径,将该路径加入到答案即可。
需要注意,如果当前节点为null,需要直接return,这也是递归的结束条件之一。
AC代码
1.DFS+回溯
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
List<String> ans = new ArrayList<>();
//因为所有栈帧的局部变量表共享ls和ans,各个栈帧对于ls以及ans两个变量的操作是会相互影响的,所以需要回溯
ArrayList<Integer> ls = new ArrayList<>();
void dfs(TreeNode root){
if(root == null) return;
if(root.left == null && root.right == null){
StringBuffer sb = new StringBuffer();
ls.add(root.val);
for(int i = 0; i < ls.size()-1; i++){
sb.append(ls.get(i)).append("->");
}
sb.append(ls.get(ls.size()-1));
ans.add(sb.toString());
ls.remove(ls.size()-1);
}else{
ls.add(root.val);
dfs(root.left);
dfs(root.right);
ls.remove(ls.size()-1);
}
}
public List<String> binaryTreePaths(TreeNode root) {
if(root == null) return ans;
dfs(root);
return ans;
}
}
2.DFS不需要回溯
class Solution {
List<String> ans = new ArrayList<>();
StringBuffer sb = new StringBuffer();
void dfs(TreeNode root,StringBuffer sb){
if(root == null) return;
//在每一次递归的时候,函数栈中每个函数的栈帧的局部变量表都会存在temp变量,各个栈帧之间的局部变量表是不会互相影响的,所以不需要进行回溯。
StringBuffer temp = new StringBuffer(sb);
temp.append(root.val);
if(root.left == null && root.right == null){
ans.add(temp.toString());
}else{
temp.append("->");
dfs(root.left,temp);
dfs(root.right,temp);
}
}
public List<String> binaryTreePaths(TreeNode root) {
if(root == null) return ans;
dfs(root,sb);
return ans;
}
}