题目描述
LeetCode传送门:112. 路径总和
题目分析
本题要判断二叉树中是否存在从根结点到叶子的路径中结点值相加等于所给值,很容易想到应该使用深度优先搜索,分别对每一条路径进行判断。
这里提供一种思路:
- 先判断左子树是否非空,若非空,递归调用该函数,同时总和sum减掉该左子树的父结点的值
- 再判断右子树是否非空,若非空,递归调用该函数,同时总和sum减掉该右子树的父结点的值
- 若递归到某个叶子结点时(判断是否为叶子结点的条件为左右子树均为空)总和sum恰好减到了0,则该叶子结点到根结点的路径中各结点权值之和即为sum,返回true
- 若遍历完二叉树后仍没有找到这样的路径,返回false
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/*sum_Num是本轮递归的总和*/
bool Path(struct TreeNode* p, int sum_Num)
{
bool i = 0, j = 0;
if(p->left)
i = Path(p->left, sum_Num - p->left->val);
if(p->right)
j = Path(p->right, sum_Num - p->right->val);
/*return说明:该处使用三目运算符,先判断p是否为叶子结点,再判断当前递归sum是否减到0*/
return (((!p->left) && (!p->right) && !sum_Num) || (i || j)) ? true : false;
}
/*sum是给定总和*/
bool hasPathSum(struct TreeNode* root, int sum){
if(!root) //空树直接返回false
return false;
return Path(root, sum - root->val);
}