https://leetcode-cn.com/problems/binary-tree-paths/
从这里开始,学习回溯算法,这是和递归有很大关联的算法。
/**
* Definition for a binary tree node.
* public class 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;
* }
* }
*/
// 打印路径:用StringBuider可变字符串数组
// 记录多条路径:ArrayList存入
// 递归:
// 传入参数:节点,已经走过的路径,路径数组
// 终止条件:结点没有左右结点就终止
// 内部逻辑:
// if(root.left == null && root.right == null){
// path加入root结点作为路径;
// 打印到叶子结点的路径,并且存入到数组当中;
// }
// if(root.left != null){
// path加入root结点作为路径;
// traverse(root.left, path, path_arr[]);
// }
// if(root.right != null){
// path加入root结点作为路径;
// traverse(root.left, path, path_arr[]);
// }
// return path_arr[];
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
List<String> path_arr = new ArrayList<>();
List<String> path = new ArrayList<>();
return traverse(root, path, path_arr);
}
public List<String> traverse(TreeNode root, List<String> path, List<String> path_arr){
path.add(Integer.toString(root.val));
if(root.left == null && root.right == null){
//到底了,开始打印
StringBuilder sb = new StringBuilder();
for(int i = 0; i < path.size() - 1; i++){
sb.append(path.get(i));
sb.append("->");
}
sb.append(path.get(path.size()-1));
path_arr.add(sb.toString());
}
if(root.left != null){
traverse(root.left, path, path_arr);
path.remove(path.size() - 1);//删除最后一个
}
if(root.right != null){
traverse(root.right, path, path_arr);
path.remove(path.size() - 1);//删除最后一个
}
return path_arr;
}
}