-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPathSum.h
77 lines (66 loc) · 2.08 KB
/
PathSum.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/*
Author: naiyong, aonaiyong@gmail.com
Date: Sep 29, 2014
Problem: Path Sum
Difficulty: 1
Source: https://oj.leetcode.com/problems/path-sum/
Notes:
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.
Solution: 1. Recursive solution.
Time: O(n), Space: O(n).
2. Iterative post-order traversal.
Time: O(n), Space: O(n).
*/
#ifndef PATHSUM_H_
#define PATHSUM_H_
#include <stack>
using std::stack;
#include "TreeNode.h"
class Solution {
public:
bool hasPathSum(TreeNode *root, int sum) {
return iterativeHasPathSum(root, sum);
}
bool recursiveHasPathSum(TreeNode *root, int sum) {
if (!root) return false;
sum -= root->val;
if (!root->left && !root->right) return sum == 0;
return recursiveHasPathSum(root->left, sum) ||
recursiveHasPathSum(root->right, sum);
}
bool iterativeHasPathSum(TreeNode *root, int sum) {
stack<TreeNode *> stk;
TreeNode *lastNodeVisited = nullptr;
while (root || !stk.empty()) {
if (root) {
sum -= root->val;
stk.push(root);
root = root->left;
}
else {
TreeNode *peakNode = stk.top();
if (!peakNode->right || peakNode->right == lastNodeVisited) {
if (!peakNode->right && !peakNode->left && !sum)
return true;
sum += peakNode->val;
lastNodeVisited = peakNode;
stk.pop();
}
else
root = peakNode->right;
}
}
return false;
}
};
#endif /* PATHSUM_H_ */