题意: 给定一棵二叉树和一个整数值sum,判断树中是否有一个从根到叶子节点的路径,使得路径上所有值相加等于这个数sum,如果有的话,返回true,否则返回false。树的结构定义如下:
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
举例: 给定如下的一棵二叉树和sum=22
5 / \ 4 8 / / \ 11 13 4 / \ \ 7 2 1
返回 true, 因为存在从根节点到叶子节点的一条路径5->4->11->2使得和为22。
分析: 本题不算难,在深度优先遍历二叉树的同时,维护一个变量tmp_sum,当遍历到路径中某个点时,将该值的 val加到tmp_sum中,在叶子节点处判断tmp_sum是否等于sum;在回退到父亲节点的时候,tmp_sum的值减去val即可。
代码
public boolean hasPathSum(TreeNode root, int sum) {
if(root == null) return false;
else return hasPathSum(root, root.val, sum);
}
//递归查找每条路径之和是否等于sum
public boolean hasPathSum(TreeNode root, int tmp_sum, int sum){
boolean left = false;
boolean right = false;
if(root.left == null && root.right == null){
if(tmp_sum == sum) return true;
else return false;
}else{
if(root.left != null){
left = hasPathSum(root.left, tmp_sum + root.left.val, sum);
}
if(root.right != null){
right = hasPathSum(root.right, tmp_sum + root.right.val, sum);
}
return left || right;
}
}