题目:
给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。
路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
题解:
一个朴素的做法是搜索以每个节点为根的(往下的)所有路径,并对路径总和为 targetSumtargetSum 的路径进行累加统计。
dfs1函数:使用 dfs1 来搜索所有节点,先用dfs2搜素root开始的路径,再用dfs1分别搜素左子树、右子树。
dfs2函数:在 dfs1 中对于每个当前节点,使用 dfs2 搜索以其为根的所有(往下的)路径,同时累加路径总和为 targetSumtargetSum 的所有路径。
/**
* 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;
* }
* }
*/
class Solution {
int res, t;
public int pathSum(TreeNode root, int targetSum) {
t = targetSum;
dfs1(root);
return res;
}
private void dfs1(TreeNode root) { //搜索所有节点
if (root == null) {
return;
}
dfs2(root, root.val);
dfs1(root.left);
dfs1(root.right);
}
private void dfs2(TreeNode root, int val) { //以其为根的所有(往下的)路径,同时累加路径总和为 targetSumtargetSum 的所有路径
if (val == t) {
res++;
}
if (root.left != null) {
dfs2(root.left, val + root.left.val);
}
if (root.right != null) {
dfs2(root.right, val + root.right.val);
}
}
}
参考:力扣