《剑指offer》刷题——【举例让抽象问题具体化】面试题34:二叉树中和为某一值的路径(java实现)
一、题目描述
输入一棵二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过
的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数字靠前)
二、题目分析
- 前序遍历
- 当遍历到某一节点,把该节点添加到路径上,并累加该节点的值
- 如果该节点为叶节点,且路径中节点值的和刚好等于输入的整数,则符合要求,打印
- 如果当前节点不是叶节点,则继续访问它的子节点
- 当前节点访问结束,即到达叶子节点,递归回到父节点
- 递归回到父节点之前,要在路径上删除当前节点,并减去当前节点的值
- 借助栈
三、代码实现
import java.util.ArrayList;
public class Solution {
ArrayList<ArrayList<Integer>> resultsList = new ArrayList<ArrayList<Integer>>();
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];
this.isTargetPath(root, target,curSum, path, index);
return this.resultsList;
}
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++;
if(curSum==target && eleNode.left==null && eleNode.right==null){
ArrayList<Integer> pathList = new ArrayList<Integer>();
for (int i = 0; i < index; i++) {
pathList.add(path[i]);
}
resultsList.add(pathList);
return;
}
if (curSum < target && eleNode.left != null) {
this.isTargetPath(eleNode.left, target, curSum, path, index);
}
if (curSum < target && eleNode.right != null) {
this.isTargetPath(eleNode.right, target, curSum, path, index);
}
}
}