257. 二叉树的所有路径
题目描述:
给你一个二叉树的根节点 root
,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
示例:
输入:root = [1,2,3,null,5]
输出:["1->2->5","1->3"]
示例 2:
输入:root = [1]
输出:["1"]
方法一:递归+拼接
核心思想:将大问题转换为小问题——> 求当前节点为根节点的路径可以划分为其左子树和右子树的路径加上当前节点的值 。
代码实现:
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
List<String> list = new ArrayList<>();
if (root==null){
return list;
}
if (root.left==null&&root.right==null){
list.add(root.val+"");
return list;
}else {
//左右子树相同方法,进行递归
List<String> leftString = binaryTreePaths(root.left);
List<String> rightString = binaryTreePaths(root.right);
//将当前节点的值拼接到左右子树生成结果的前面
leftString.stream().forEach(item->{
list.add(root.val+"->"+item);
});
rightString.stream().forEach(item->{
list.add(root.val+"->"+item);
});
return list;
}
}
}
方法二:深度优先遍历dfs
核心思想:
如果当前节点不是叶子节点,则在当前的路径末尾添加该节点,并继续递归遍历该节点的每一个孩子节点。
如果当前节点是叶子节点,则在当前路径末尾添加该节点后我们就得到了一条从根节点到叶子节点的路径,将该路径加入到答案即可。
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
List<String> res = new ArrayList<>();
dfs(res,root,"");
return res;
}
public void dfs(List<String> list,TreeNode root,String path){
if (root!=null){
StringBuffer sbpath = new StringBuffer(path);
sbpath.append(Integer.toString(root.val));
if (root.left==null&&root.right==null){
list.add(sbpath.toString());
}else {
sbpath.append("->");
dfs(list,root.left,sbpath.toString());
dfs(list,root.right,sbpath.toString());
}
}
}
}