1 题目描述
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [1,2,3,null,5]
输出:[“1->2->5”,“1->3”]
示例 2:
输入:root = [1]
输出:[“1”]
来源:力扣(LeetCode)
链接:257. 二叉树的所有路径
2 算法设计
求根节点到所有叶节点的路径,应该采用前序遍历(根->左->右),方便记录父节点指向孩子节点的路径。这里采用递归的方式对节点进行遍历,当遍历到叶节点的时候就找到了当前的一条路径,然后将该路径存到结果集数组即可。之后便进行回溯,回退到前一个节点的位置,若该节点还有路径没有访问则继续递归,否则继续回退。
3 代码实现
public List<String> binaryTreePaths(TreeNode root) {
List<String> list = new ArrayList<>();
if (root == null) return list;
List<Integer> paths = new ArrayList<>();
traversal(root,paths,list);
return list;
}
public void traversal(TreeNode root,List<Integer> paths,List<String> res){
paths.add(root.val);
//判断当前节点是否是叶子节点
if (root.left == null && root.right == null){
//输出当前路径
StringBuilder sb = new StringBuilder();
for (int i = 0;i < paths.size() - 1;i++){
sb.append(paths.get(i)).append("->");
}
//将路径上最后一个节点加入sb
sb.append(paths.get(paths.size()-1));
//将路径添加到结果集中
res.add(sb.toString());
return;
}
if (root.left != null){
//向左子树递归
traversal(root.left,paths,res);
//回溯
paths.remove(paths.size()-1);
}
if (root.right != null){
//向右子树递归
traversal(root.right,paths,res);
//回溯
paths.remove(paths.size()-1);
}
}