[LeetCode] Binary Tree Paths 二叉树路径
Given a binary tree, return all root-to-leaf paths.
For example, given the following binary tree:
1
/ \
2 3
\
5
All root-to-leaf paths are:
["1->2->5", "1->3"]
这道题给我们一个二叉树,让我们返回所有根到叶节点的路径,跟之前那道Path Sum II很类似,比那道稍微简单一些,不需要计算路径和,只需要无脑返回所有的路径即可,那么思路还是用递归来解,博主之前就强调过,玩树的题目,十有八九都是递归,而递归的核心就是不停的DFS到叶结点,然后在回溯回去。在递归函数中,当我们遇到叶结点的时候,即没有左右子结点,那么此时一条完整的路径已经形成了,我们加上当前的叶结点后存入结果res中,然后回溯。注意这里结果res需要reference,而out是不需要引用的,不然回溯回去还要删除新添加的结点,很麻烦。为了减少判断空结点的步骤,我们在调用递归函数之前都检验一下非空即可,代码而很简洁,参见如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
List<String> paths = new ArrayList<>();
List<Integer> values = new ArrayList<>();
if(root == null)
return paths;
help(root, values, paths);
return paths;
}
//主要思路:判断是不是叶子节点 是的话返回每次遍历的结果,不是的话就往下 往下就是左右两个子树分别进行
private void help(TreeNode node, List<Integer> values, List<String> paths){
if(node == null)
return;
values.add(node.val);
if(isLeaf(node)){
paths.add(buildPath(values));
}else{
help(node.left, values, paths);
help(node.right, values, paths);
}
//当这个节点遍历之后,无论返回结果与否, 需要删除这个节点保障不影响下次的判断
values.remove(values.size() - 1);
}
private boolean isLeaf(TreeNode node){
return node.left == null && node.right == null;
}
private String buildPath(List<Integer> value){
StringBuilder sb = new StringBuilder();
for(int i=0; i < value.size(); i++){
sb.append(value.get(i));
if(i != value.size() - 1)
sb.append("->");
}
return sb.toString();
}
}