Skip to content

Commit 7e671bf

Browse files
authored
Create count-nodes-equal-to-average-of-subtree.cpp
1 parent fd532f3 commit 7e671bf

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+
// dfs
5+
class Solution {
6+
public:
7+
int averageOfSubtree(TreeNode* root) {
8+
const auto& iter_dfs = [&](TreeNode *root) {
9+
int result = 0;
10+
using RET = pair<int, int>;
11+
RET ret;
12+
vector<tuple<int, TreeNode *, shared_ptr<RET>, shared_ptr<RET>, RET *>> stk;
13+
stk.emplace_back(1, root, nullptr, nullptr, &ret);
14+
while (!empty(stk)) {
15+
auto [step, node, ret1, ret2, ret] = stk.back(); stk.pop_back();
16+
if (step == 1) {
17+
if (!node) {
18+
continue;
19+
}
20+
auto ret1 = make_shared<RET>(), ret2 = make_shared<RET>();
21+
stk.emplace_back(2, node, ret1, ret2, ret);
22+
stk.emplace_back(1, node->right, nullptr, nullptr, ret2.get());
23+
stk.emplace_back(1, node->left, nullptr, nullptr, ret1.get());
24+
} else if (step == 2) {
25+
(*ret).first = (*ret1).first + (*ret2).first + node->val;
26+
(*ret).second = (*ret1).second + (*ret2).second + 1;
27+
result += static_cast<int>((*ret).first / (*ret).second == node->val);
28+
}
29+
}
30+
return result;
31+
};
32+
33+
return iter_dfs(root);
34+
}
35+
};
36+
37+
// Time: O(n)
38+
// Space: O(h)
39+
// dfs
40+
class Solution2 {
41+
public:
42+
int averageOfSubtree(TreeNode* root) {
43+
function<tuple<int, int, int>(TreeNode*)> dfs = [&](TreeNode *node) {
44+
if (!node) {
45+
return make_tuple(0, 0, 0);
46+
}
47+
const auto& left = dfs(node->left);
48+
const auto& right = dfs(node->right);
49+
return make_tuple(get<0>(left) + get<0>(right) + node->val,
50+
get<1>(left) + get<1>(right) + 1,
51+
get<2>(left) + get<2>(right) +
52+
static_cast<int>((get<0>(left) + get<0>(right) + node->val) /
53+
(get<1>(left) + get<1>(right) + 1) == node->val));
54+
};
55+
56+
return get<2>(dfs(root));
57+
}
58+
};

0 commit comments

Comments
 (0)