题目
给定一个二叉树,返回所有从根节点到叶子节点的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
输入: 1 / \ 2 3 \ 5 输出: ["1->2->5", "1->3"] 解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3
题解
利用String特性进行参数传递,达到回溯效果,但是也由于每对String进行操作都会先生成一个拷贝String,然后在拷贝上操作,因此会占用大量内存。如果需要节省内存可以使用StringBuilder,每次传参都新开一个StringBuilder()。
/**
* 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> res = new ArrayList<>();
if(root == null) return res;
findPaths(res, "", root);
return res;
}
// 对任何一个String操作都会先生成一个拷贝,然后对这个拷贝操作,利用String作为形参传递,达到回溯效果
private void findPaths(List<String> res, String cur, TreeNode root){
if(root == null) return;
cur += root.val;
if(root.left == null && root.right == null)
res.add(cur);
else{
findPaths(res, cur + "->", root.left);
findPaths(res, cur + "->", root.right);
}
}
}
2、StringBuilder()
/**
* 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> res = new ArrayList<>();
if(root == null) return res;
findPaths(res, new StringBuilder(), root);
return res;
}
// 每次传参新开一个StringBuilder
private void findPaths(List<String> res, StringBuilder sb, TreeNode root){
if(root == null) return;
sb.append(root.val);
if(root.left == null && root.right == null){
res.add(sb.toString());
return;
}
if(root.left != null) findPaths(res, new StringBuilder(sb).append("->"), root.left);
if(root.right != null) findPaths(res, new StringBuilder(sb).append("->"), root.right);
}
}