Skip to content

Commit 74321da

Browse files
authored
Create maximum-difference-between-node-and-ancestor.cpp
1 parent 8b0f4c7 commit 74321da

File tree

1 file changed

+58
-0
lines changed

1 file changed

+58
-0
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// Time: O(n)
2+
// Space: O(h)
3+
4+
/**
5+
* Definition for a binary tree node.
6+
* struct TreeNode {
7+
* int val;
8+
* TreeNode *left;
9+
* TreeNode *right;
10+
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
11+
* };
12+
*/
13+
14+
// iterative stack solution
15+
class Solution {
16+
public:
17+
int maxAncestorDiff(TreeNode* root) {
18+
using NODE = tuple<TreeNode*, int, int>;
19+
int result = 0;
20+
vector<NODE> stack{{root, 0, numeric_limits<int>::max()}};
21+
while (!stack.empty()) {
22+
TreeNode *node; int mx, mn;
23+
tie(node, mx, mn) = stack.back(); stack.pop_back();
24+
if (!node) {
25+
continue;
26+
}
27+
result = max(result, max(mx - node->val, node->val - mn));
28+
mx = max(mx, node->val);
29+
mn = min(mn, node->val);
30+
stack.emplace_back(node->left, mx, mn);
31+
stack.emplace_back(node->right, mx, mn);
32+
}
33+
return result;
34+
}
35+
};
36+
37+
// Time: O(n)
38+
// Space: O(h)
39+
// recursive solution
40+
class Solution2 {
41+
public:
42+
int maxAncestorDiff(TreeNode* root) {
43+
return maxAncestorDiffHelper(root, 0, numeric_limits<int>::max());
44+
}
45+
46+
private:
47+
int maxAncestorDiffHelper(TreeNode* node, int mx, int mn) {
48+
if (!node) {
49+
return 0;
50+
}
51+
int result = max(mx - node->val, node->val - mn);
52+
mx = max(mx, node->val);
53+
mn = min(mn, node->val);
54+
result = max(result, maxAncestorDiffHelper(node->left, mx, mn));
55+
result = max(result, maxAncestorDiffHelper(node->right, mx, mn));
56+
return result;
57+
}
58+
};

0 commit comments

Comments
 (0)