#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;
/*
问题:
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.
分析:给定二叉树,从根节点到叶子结点是否存在路径使得该路径上的和等于给定值?
注意:可能存在负数。直接暴力破解,从根节点到到叶子结点,计算出累加和。
如果当前结点不是叶子结点,就将当前结点的值存入到结果集;如果是叶子结点,
就将结果集中所有元素的和+当前叶子结点的值看是否等于给定值,如果是终止递归,
返回结果。
或者从根节点向下遍历到当前结点时,存储从根节点到当前结点的和。
当抵达叶节点的之后,判断该和是否等于当前结果集
报错:
Input:[1,2] 3
Output:false
Expected:true
关键:
1 我们采用每当遍历到非叶子结点的时候,就减去当前结点的值;直到遇到叶子结点时,判断sum是否为0即可
//必须减去当前结点的值。
sum -= root->val;
//如果当前结点是叶节点,判断sum是否为0
if(NULL == root->left && NULL == root->right)
{
if(0 == sum)
{
return true;
}
//如果没找到,还得继续寻找
}
//非叶子结点,递归寻找其左孩子和右孩子。左孩子如果为空,不继续向下寻找,因为不满足叶节点条件
bool isLeftOk = false;
bool isRightOk = false;
if(root->left)
{
//因为sum已经减掉当前结点的值了,因此这里无需再减去左孩子的值,这个留到下一轮递归自然会处理
isLeftOk = hasPathSum(root->left , sum);
*/
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
//我们采用每当遍历到非叶子结点的时候,就减去当前结点的值;直到遇到叶子结点时,判断sum是否为0即可
bool hasPathSum(TreeNode* root, int sum) {
//当前结点为空,肯定不行
if(!root)
{
return false;
}
//必须减去当前结点的值。
sum -= root->val;
//如果当前结点是叶节点,判断sum是否为0
if(NULL == root->left && NULL == root->right)
{
if(0 == sum)
{
return true;
}
//如果没找到,还得继续寻找
}
//非叶子结点,递归寻找其左孩子和右孩子。左孩子如果为空,不继续向下寻找,因为不满足叶节点条件
bool isLeftOk = false;
bool isRightOk = false;
if(root->left)
{
//因为sum已经减掉当前结点的值了,因此这里无需再减去左孩子的值,这个留到下一轮递归自然会处理
isLeftOk = hasPathSum(root->left , sum);
}
//如果左子树满足,直接返回
if(isLeftOk)
{
return true;
}
if(root->right)
{
isRightOk = hasPathSum(root->right , sum);
}
return isRightOk;
}
};
void print(vector<int>& result)
{
if(result.empty())
{
cout << "no result" << endl;
return;
}
int size = result.size();
for(int i = 0 ; i < size ; i++)
{
cout << result.at(i) << " " ;
}
cout << endl;
}
void process()
{
vector<int> nums;
int value;
int num;
Solution solution;
vector<int> result;
while(cin >> num )
{
nums.clear();
for(int i = 0 ; i < num ; i++)
{
cin >> value;
nums.push_back(value);
}
}
}
int main(int argc , char* argv[])
{
process();
getchar();
return 0;
}
leecode 解题总结:112. Path Sum
最新推荐文章于 2022-02-28 19:00:43 发布