给定一个二叉树,返回所有从根节点到叶子节点的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
输入:
1
/ \
2 3
\
5
输出: ["1->2->5", "1->3"]
解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3
思路
思路很简单,就是先用一个ArrayList
来存放暂时的路径,当DFS搜到叶子结点时,将此时的这条暂时路径转化为String
(这里我用StringBuffer
来处理),并存放到List<String>
之中。
要注意的一点就是,当从DFS退出来之后,要及时把路径中的最后一个点删去,这样才能添加第二条/第三条…的路径。
代码
public class Solution {
public static class TreeNode {//为了方便本地调试调用内部类,我写了静态的
//实际提交时可以不写TreeNode类
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
List<String> path = new ArrayList<String>();
ArrayList<Integer> tempPath = new ArrayList<Integer>();
public void dfs(TreeNode root) {
tempPath.add(root.val);
if(root.left==null&&root.right==null) {
StringBuffer sBuffer = new StringBuffer();
for(int i=0;i<tempPath.size();i++) {
if(i==0) {
sBuffer.append(String.valueOf(tempPath.get(i)));
}
else {
sBuffer.append("->");
sBuffer.append(String.valueOf(tempPath.get(i)));
}
}
String tmp = sBuffer.toString();
path.add(tmp);
}
if(root.left!=null) {
dfs(root.left);
tempPath.remove(tempPath.size()-1);
}
if(root.right!=null) {
dfs(root.right);
tempPath.remove(tempPath.size()-1);
}
}
public List<String> binaryTreePaths(TreeNode root){
if(root!=null) dfs(root);
return path;
}
}