Skip to content

Commit e770dcd

Browse files
authored
Create lowest-common-ancestor-of-a-binary-tree-ii.cpp
1 parent acc2f32 commit e770dcd

File tree

1 file changed

+71
-0
lines changed

1 file changed

+71
-0
lines changed
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
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+
class Solution {
14+
public:
15+
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
16+
return iter_dfs(root, p, q);
17+
}
18+
19+
private:
20+
TreeNode *iter_dfs(TreeNode* node, TreeNode* p, TreeNode* q) {
21+
TreeNode *result = nullptr;
22+
int ret = 0;
23+
vector<tuple<int, TreeNode *, unique_ptr<int>, unique_ptr<int>, int*>> stk;
24+
stk.emplace_back(1, node, nullptr, nullptr, &ret);
25+
while (!empty(stk)) {
26+
const auto [step, node, ret1, ret2, ret] = move(stk.back()); stk.pop_back();
27+
if (step == 1) {
28+
if (!node) {
29+
continue;
30+
}
31+
auto ret1 = make_unique<int>(), ret2 = make_unique<int>();
32+
auto p1 = ret1.get(), p2 = ret2.get();
33+
stk.emplace_back(2, node, move(ret1), move(ret2), ret);
34+
stk.emplace_back(1, node->right, nullptr, nullptr, p2);
35+
stk.emplace_back(1, node->left, nullptr, nullptr, p1);
36+
} else if (step == 2) {
37+
auto curr = int(node == p || node == q);
38+
if (curr + *ret1 + *ret2 == 2 && !result) {
39+
result = node;
40+
}
41+
*ret = curr + *ret1 + *ret2;
42+
}
43+
}
44+
return result;
45+
}
46+
};
47+
48+
// Time: O(n)
49+
// Space: O(h)
50+
class Solution2 {
51+
public:
52+
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
53+
TreeNode *result = nullptr;
54+
dfs(root, p, q, &result);
55+
return result;
56+
}
57+
58+
private:
59+
int dfs(TreeNode* node, TreeNode* p, TreeNode* q, TreeNode** result) {
60+
if (!node) {
61+
return 0;
62+
}
63+
auto left = dfs(node->left, p, q, result);
64+
auto right = dfs(node->right, p, q, result);
65+
auto curr = int(node == p || node == q);
66+
if (curr + left + right == 2 && !(*result)) {
67+
*result = node;
68+
}
69+
return curr + left + right;
70+
}
71+
};

0 commit comments

Comments
 (0)