DFS方法
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
List<String> res = new ArrayList<String>();
if(root == null) return res;
dfs(root,res,0);
return res;
}
public void dfs(TreeNode node,List<String> res,int i){
if(node == null) ;
else{
//判断是否是root,是root就只加root值
if(res.size() == 0) res.add(node.val+"");
else res.set(i,res.get(i) + "->" + node.val);
//如果只有一个子节点或者无子节点,则不需要复制字符串,只要对res[i]进行修改就行
if(node.left == null || node.right == null){
dfs(node.left,res,i);
dfs(node.right,res,i);
}else{
/* 如果有两个子节点,则先将当前路径复制到List末尾,先右后左
如果是先左后右的话,会导致左子树的所有有两个节点的情况都对list末尾进行操作。*/
res.add(res.get(i));
dfs(node.right,res,res.size() - 1);
dfs(node.left,res,i);
}
}
}
}
DFS改进版
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
List<String> res = new ArrayList<String>();
dfs(root,res,"");
return res;
}
public void dfs(TreeNode node,List<String> res,String path){
if(node != null) {
StringBuffer pathSB = new StringBuffer(path);
pathSB.append(Integer.toString(node.val));
if(node.left == null && node.right == null){
res.add(pathSB.toString());
} else {
pathSB.append("->");
dfs(node.left,res,pathSB.toString());
dfs(node.right,res,pathSB.toString());
}
}
}
}
思路大致相同,他用了String保存临时路径,当走到终点时才将路径加入List,而我是每次出现分叉则加入新的路径,每次修改路径,比较对list的存取次数很多,导致运行时间长