原题:
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.
思路:深度遍历和堆栈结构。但我单独开辟一个堆栈用于记录每一层sum的值,在遇到sum<s的节点直接返回不用再继续深度遍历。
代码:
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool hasPathSum(TreeNode *root, int sum) {
if(root==NULL || (sum==root->val && (root->right || root->left)) ) return false;
if (sum==root->val && !root->right &&!root->left) return true;
int s = 0;
stack<TreeNode*> nodes;
stack<int> sums;
nodes.push(root);
sums.push(s);
while(!nodes.empty()){
TreeNode *tmp = nodes.top();
s += tmp->val;
if(s>sum){
s=sums.top();
nodes.pop();
}
else{
sums.push(s);
nodes.pop();
if(s==sum) return true;
if(tmp->right) nodes.push(tmp->right);
if(tmp->left) nodes.push(tmp->left);
}
}
return false;
}
};
看来此次代码没有考虑到节点值为负的情况。
============================================================================================================================
class Solution {
public:
bool hasPathSum(TreeNode *root, int sum) {
if(!root) return false;
int cursum;
cursum = sum-root->val;
if (!root->left && !root->right) return cursum==0 ;
else return hasPathSum(root->left,cursum)||hasPathSum(root->right,cursum);
}
};
再网上查阅资料后写的如上代码。十分简洁明了。找到根节点,每深入一层,从sum值中减去上一层的值。递归下去。