leet code
538: Count Univalue Subtrees
메모리를 많이 잡아먹고, 코드가 길었음
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
78
79
80
81
82
83
84
85
86
87
88
89 | /**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
struct returnVal{
int cnt;
bool continued;
};
class Solution {
public:
int countUnivalSubtrees(TreeNode* root) {
if(!root) return 0;
returnVal rv = solve(root);
return rv.cnt;
}
returnVal solve(TreeNode* node)
{
returnVal rv;
rv.cnt = 0;
rv.continued = true;
if(!node->left && !node->right)
{
rv.cnt = 1;
return rv;
}
if(node->left && node->right)
{
returnVal rv1, rv2;
rv1 = solve(node->left);
rv2 = solve(node->right);
rv.cnt += rv1.cnt + rv2.cnt;
rv.continued = rv1.continued && rv2.continued;
if(rv.continued)
{
if(node->left->val != node->val || node->right->val != node->val)
{
rv.continued = false;
}else
{
rv.cnt++;
}
}
}else if(!node->left && node->right)
{
returnVal rv1;
rv1 = solve(node->right);
rv.cnt += rv1.cnt;
rv.continued = rv1.continued;
if(rv.continued)
{
if(node->right->val != node->val)
{
rv.continued = false;
}else
{
rv.cnt++;
}
}
}else if(node->left && !node->right)
{
returnVal rv1;
rv1 = solve(node->left);
rv.cnt += rv1.cnt;
rv.continued = rv1.continued;
if(rv.continued)
{
if(node->left->val != node->val)
{
rv.continued = false;
}else
{
rv.cnt++;
}
}
}
return rv;
}
};
|
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 | class Solution {
public:
int countUnivalSubtrees(TreeNode* root) {
int count = 0;
countUnivalSubtreesRecursive(root, count);
return count;
}
bool countUnivalSubtreesRecursive(TreeNode* root, int& count)
{
if(root == NULL) return true;
auto isLeftUnival = countUnivalSubtreesRecursive(root->left, count);
auto isRightUnival = countUnivalSubtreesRecursive(root->right, count);
if(isLeftUnival && isRightUnival
&& ((root->left == NULL) || root->left->val == root->val)
&& ((root->right == NULL) || root->right->val == root->val)
)
{
++count;
return true;
}
return false;
}
};
|
- 함수의 반환형: 부모 노드에서 자식의 정보를 알고 있기 때문에, bool type으로 충분
- count는 stack보다 전역 변수로 두는게 좋음