-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathsolution.cpp
90 lines (86 loc) · 2.81 KB
/
solution.cpp
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
90
/**
* 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) {}
* };
*/
/**
* 105 / 105 test cases passed.
* Runtime: 488 ms
* Memory Usage: 147.5 MB
*/
class Solution {
public:
bool isEvenOddTree(TreeNode* root) {
queue<TreeNode*> que;
if (nullptr == root)
return false;
que.push(root);
int level = 0;
while (!que.empty()) {
int pre;
int sz = que.size();
for (int i = 0; i < sz; ++i) {
TreeNode* front = que.front();
que.pop();
if ((level % 2 == 0 && front->val % 2 == 0)) {
return false;
} else if (level % 2 == 1 && front->val % 2 == 1) {
return false;
}
if (i == 0) {
pre = front->val;
} else {
if (level % 2 == 0 && pre >= front->val)
return false;
else if (level % 2 == 1 && pre <= front->val)
return false;
pre = front->val;
}
if (nullptr != front->left) que.push(front->left);
if (nullptr != front->right) que.push(front->right);
}
++level;
}
return true;
}
};
/**
* 105 / 105 test cases passed.
* Runtime: 240 ms
* Memory Usage: 147.2 MB
*/
class Solution2 {
public:
bool isEvenOddTree(TreeNode* root) {
queue<TreeNode*> que;
que.push(root);
int level = 0, size = 1;
while (!que.empty()) {
int pre;
for (int i = 0; i < size; ++ i) {
auto p_node = que.front(); que.pop();
if (level & 1) { // odd level, decremental even sequential
// so, return false if there is incremental odd sequential
if (p_node->val % 2 == 1) return false;
if (i > 0 && p_node->val >= pre) return false;
} else { // even level, incremental odd sequential
// so, return false if there is decremental even sequential
if (p_node->val % 2 == 0) return false;
if (i > 0 && p_node->val <= pre) return false;
}
pre = p_node->val;
if (p_node->left) que.push(p_node->left);
if (p_node->right) que.push(p_node->right);
}
++ level;
size = que.size();
}
return true;
}
};