题目链接:
题目描述:
Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum.
For example:
Given the below binary tree and sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ \
7 2 1
return true, as there exist a root-to-leaf path 5->4->11->2 which sum is 22
题目解释:
给定一个二叉树和一个数值,判断这棵二叉树是否有一个从根节点到叶节点的路径使得这个路径上节点上的数值之和为给定的数值,如果存在就返回true,否则就返回false,例如:上面给的一个实例,存在一条路径5->4->11->2 是得匹配sum==22。
解题方案:
遇到树的问题,我们大多要考虑递归的思想,这道题同样,我们也有考虑递归解决,我们要用递归解决问题那么就要找到这个问题的递归表达式,将解题步骤划分成一步一步向结果靠近的方式,我们来拿题干给出的实例来分析,如果我们要判断二叉树最左侧的那条路径符不符合要求时,我们从根节点向下遍历,遍历完根节点以后我们只要判断剩下的路径节点数值之和是否等于(22-5=17)即可,这样我们就可以得到递归表达式:
return hasPathSum(root->left, sum - root->val) || hasPathSum(root->right,sum - root->val);
我们按照相同的方式递归处理根节点的左子树和右子树即可,这里要注意一点,因为只要有一条路径就符合要求我们就返回true,所以在这里递归处理左子树和右子树的结果要取或。
递归表达式我们找到了,接下来我们要寻找递归的出口,递归出口分为以下几种情况:
- 已经遍历到叶节点,但是不符合要求,此时我们要返回false。
- 给的根节点为空,此时我们也有返回false.
- 已经遍历到也叶节点,且该路径满足要求,此时我们返回true。
所以我们看到代码中的第一个if语句就是处理第二个递归出口,第二个if语句块处理的就是1,3 递归出口。
接下来咱们看一下具体的实现代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool hasPathSum(struct TreeNode* root, int sum)
{
if (root == NULL)
{
return false;
}
if (root->left == NULL && root->right == NULL)
{
if (root->val == sum)
{
return true;
}
else
{
return false;
}
}
return hasPathSum(root->left, sum - root->val) || hasPathSum(root->right,sum - root->val);
}
这个题目给我们的提示就是要加强递归思想的学习,要习惯于这种思维方式。