- 描述: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,如果存在,返回true,否则返回false。
- 思路一:递归调用求解。
class Solution {
public:
bool hasPathSum(TreeNode* root, int sum) {
if (root == NULL) return false;
return judge(root, sum, 0);
}
private:
bool judge(TreeNode * root, int sum, int add) {
add += root -> val;
if (root -> left == NULL && root -> right == NULL) {
return (sum == add);
}
return ((root -> left) && judge(root -> left, sum, add)) || ((root -> right) && judge(root -> right, sum, add));
}
};
- 思路二:使用dfs非递归的方式求解。
class Solution {
public:
bool hasPathSum(TreeNode* root, int sum) {
if (root == NULL) return false;
stack<TreeNode*> my_stk;
int sub = sum - root -> val;
my_stk.push(root);
unordered_map<TreeNode*, bool> visit;
visit[root] = true;
while (!my_stk.empty()) {
TreeNode* top = my_stk.top();
if (top -> left == NULL && top -> right == NULL) {
if (!sub) return true;
}
if (top -> left && !visit[top -> left]) {
my_stk.push(top -> left);
visit[top -> left] = true;
sub -= top -> left -> val;
continue;
}
if (top -> right && !visit[top -> right]) {
my_stk.push(top -> right);
visit[top -> right] = true;
sub -= top -> right -> val;
continue;
}
sub += top -> val;
my_stk.pop();
}
return false;
}
};