题目要求
寻找二叉树中 满足条件的路径数
条件:路径中的节点值之和 = targetSum
不规定从根节点开始,但路径的方向必须是向下的
思路
1.通过遍历二叉树 获取到每个节点
2.将每个节点 作为起始点 通过递归 获取到该节点的所有路径 并计算每条路径的节点值之和 存入一个集合中
2.1 实现细节
函数的形参中需要有 记录路径节点值之和 的变量
method(TreeNode root,List<Integer> list,int res){
res += node.val;
list.add(res);
//左子树不为null 遍历左子树
if (node.left != null) {
method(node.left, list, res);
}
//右子树不为null 遍历右子树
if (node.right != null) {
method(node.right, list, res);
}
return list;
}
3.遍历该集合 定义一个变量 记录 集合元素 = targetSum 的个数 并返回
例子
targetSum = 6
方法运行
遍历得到1
递归获取1为起始的路径和 集合
[1,1+2,1+2+4,1+2+5,1+3,1+3+6]
计算 和 = 6 的元素数 上文 集合 满足条件元素数 = 0
遍历得到3
递归获取3为起始的路径和 集合
[3,3+6]
计算 和 = 6 的元素数 上文 集合 满足条件元素数 = 0
遍历得到2
递归获取3为起始的路径和 集合
[2,2+4,2+5]
计算 和 = 6 的元素数 上文 集合 满足条件元素数 = 1
......
解法
class Solution {
public int pathSum(TreeNode root, int targetSum) {
if(root == null){
return 0;
} else {
//记录满足targetSum的集合元素数
int sum = 0;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
//将深搜遍历到的节点 传入method中 获取以该节点为起始的 节点路径和 集合
List<Integer> list = new ArrayList<>();
List<Integer> res = method(node, list, 0);
//遍历 节点路径和 集合
for (Integer re : res) {
if (re == targetSum) {
sum++;
}
}
if (node.left != null) {
stack.push(node.left);
}
if (node.right != null) {
stack.push(node.right);
}
}
return sum;
}
}
public List<Integer> method(TreeNode node, List<Integer> list, int res) {
//遍历到的节点值 加入res中
res += node.val;
//将每种路径的节点和 加入list中
list.add(res);
if (node.left != null) {
method(node.left, list, res);
}
if (node.right != null) {
method(node.right, list, res);
}
return list;
}
}