您的位置:首页 > 其它

Leetcode 题解 - 搜索--Backtracking(12):输出二叉树中所有从根到叶子的路径

2019-05-27 10:41 661 查看

[LeetCode] Binary Tree Paths 二叉树路径

 

Given a binary tree, return all root-to-leaf paths.

For example, given the following binary tree:

 

[code]   1
/   \
2     3
\
5

All root-to-leaf paths are:

[code]["1->2->5", "1->3"]

 

这道题给我们一个二叉树,让我们返回所有根到叶节点的路径,跟之前那道Path Sum II很类似,比那道稍微简单一些,不需要计算路径和,只需要无脑返回所有的路径即可,那么思路还是用递归来解,博主之前就强调过,玩树的题目,十有八九都是递归,而递归的核心就是不停的DFS到叶结点,然后在回溯回去。在递归函数中,当我们遇到叶结点的时候,即没有左右子结点,那么此时一条完整的路径已经形成了,我们加上当前的叶结点后存入结果res中,然后回溯。注意这里结果res需要reference,而out是不需要引用的,不然回溯回去还要删除新添加的结点,很麻烦。为了减少判断空结点的步骤,我们在调用递归函数之前都检验一下非空即可,代码而很简洁,参见如下:

 

[code]/**
* 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();

}
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: