一、题目
给定一棵二叉树,其中每个节点都含有一个整数数值(该值或正或负)。设计一个算法,打印节点数值总和等于某个给定值的所有路径的数量。注意,路径不一定非得从二叉树的根节点或叶节点开始或结束,但是其方向必须向下(只能从父节点指向子节点方向)。
二、解题思路
首先求从某个节点开始的路径和,再遍历求二叉树的所有节点路径和,结果相加即可。
三、代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int pathSum(TreeNode root, int sum) {
if(root==null){
return 0;
}
//此处为了遍历二叉树的所有可能节点。
return path(root,sum)+pathSum(root.left,sum)+pathSum(root.right,sum);
}
//求从某个节点开始,是否存在指定的路径和
public int path(TreeNode root, int sum) {
int ret=0; //因为本题存在负数,所有遍历过的子路径不能返回,需要继续遍历包含该子路径的路径。
if(root==null) {
return 0;
}
//使用ret来记录存在多少条满足题目要求的路径。
if(sum==root.val) {
ret+=1;
}
//遍历左子树
ret+=path(root.left,sum-root.val);
//遍历右子树
ret+=path(root.right,sum-root.val);
return ret;
}
}
四、运行结果