给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [1,2,3,null,5]
输出:[“1->2->5”,“1->3”]
示例 2:
输入:root = [1]
输出:[“1”]
提示:
树中节点的数目在范围 [1, 100] 内
-100 <= Node.val <= 100
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-paths
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
由题可得这是一个典型的深搜的题目,深搜的题目解法一般在于深搜发生的条件和结束的条件。
解法一
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
List<String> list = new ArrayList<>();
dfs(root,list,"");//深搜的方法
return list;
}
public void dfs(TreeNode root,List<String> list,String path){
if(root == null){ //判断是否为空,避免空指针情况的发生
return;
}
if(root.left == null && root.right == null){ //达到搜索的结束,即到达树的叶子节点,然后将其添加入ans
list.add(path+root.val);
return;
}
dfs(root.left,list,path+root.val+"->"); //向左进行搜索
dfs(root.right,list,path+root.val+"->"); //向右进行搜索递归搜索
}
}
此处是未进行优化的过程,字符串的操作往往可以通过StringBuilder进行优化一定的效率。
优化后的代码
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
List<String> list = new ArrayList<>();
dfs(root,list,"");
return list;
}
public void dfs(TreeNode root,List<String> list,String path){
if(root!=null){
StringBuilder sb = new StringBuilder(path);
sb.append(Integer.toString(root.val));
if(root.right == null && root.left == null){
list.add(sb.toString());
return;
}else{
sb.append("->");
dfs(root.left,list,sb.toString());
dfs(root.right,list,sb.toString());
}
}
}