题目描述
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
解题思路
1.先序遍历:根节点,左节点,右节点
2.每遍历到一个值,判断是不是叶子节点以及是不是和等于目标值,同时满足就为路径;否则的话继续左子树递归调用以上方法,右子树递归调用以上方法。
代码
import java.util.*;
public class Solution {
// 1.全局变量,用于存储得到的每一个路径
ArrayList<ArrayList<Integer>> resultsList = new ArrayList<ArrayList<Integer>>();
//2.从根节点开始进行操作
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
ArrayList<Integer> pathList = new ArrayList<Integer>();
if (root == null) {
return resultsList;
}
int curSum = 0;//当前的和
int index = 0;//数组的下标
int []path = new int[1000];//数组用来存放的是某一条路径
isTargetPath(root, target, curSum, path, index);
return resultsList;
}
//3.每个结点进行的操作:求和,纪录路径
public void isTargetPath(TreeNode eleNode, int target, int curSum, int []path, int index) {
if (eleNode == null) {
return;
}
curSum += eleNode.val;
path[index] = eleNode.val;
index ++;
// 3.1 当前已经是处于叶子节点,并且累计的和与target相等
if (curSum == target && eleNode.left == null && eleNode.right == null) {
// 3.1.1 将得到的结果放在外层结构中
ArrayList<Integer> pathList = new ArrayList<Integer>();
for (int i = 0; i < index; i++) {
pathList.add(path[i]);
}
//3.1.2 将这条路径放入到结果集合中
resultsList.add(pathList);
return;
}
// 3.2 该节点有左子节点,前提还是要curSum 小于 target,否则递归就没有意义了
if (curSum < target && eleNode.left != null) {
isTargetPath(eleNode.left, target, curSum, path, index);
}
// 3.3 该节点有右子节点,前提还是要curSum 小于 target,否则递归就没有意义了
if (curSum < target && eleNode.right != null) {
isTargetPath(eleNode.right, target, curSum, path, index);
}
}
}