题目描述
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
思路
通过先序遍历树节点,通过栈的方式来回溯
解法一:简化
package demo1;
import java.util.ArrayList;
import java.util.Stack;
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public class SolutionDemo {
private ArrayList<Integer> list = new ArrayList<Integer>(); // 记录所有的条数
private ArrayList<ArrayList<Integer>> listAll = new ArrayList<ArrayList<Integer>>(); // 记录满足条件的list,初始化为null
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
if (root == null)
return listAll;
list.add(root.val);
target -= root.val;
if (target == 0 && root.left == null && root.right == null) {
listAll.add(new ArrayList<Integer>(list));
}
FindPath(root.left, target); // 只是执行,返回值并没有用,所以不接受返回结果,下同理
FindPath(root.right, target);
list.remove(list.size() - 1); // 走到这里说明此时,target<0或者left&right都等于null,回溯
return listAll;
}
}
解法二:书上版本
import java.util.ArrayList;
import java.util.Stack;
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public class Solution {
private ArrayList<ArrayList<Integer>> listAll = new ArrayList<ArrayList<Integer>>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
if (root == null)
return listAll;
Stack path = new Stack();
int currentSum = 0;
return FindPath(root, target, path, currentSum);
}
private ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target, Stack path, int currentSum) {
currentSum += root.val;
path.push(root.val);
Boolean isLeaf = root.left == null && root.right == null;
if(currentSum == target && isLeaf) {
listAll.add(new ArrayList<Integer>(path));
}
if(root.left != null) {
FindPath(root.left, target, path, currentSum);
}
if(root.right != null) {
FindPath(root.right, target, path, currentSum);
}
path.pop();
return listAll;
}
}