
Input: root =[1,10,4,3,null,7,9,12,8,6,null,null,2]Output: trueExplanation: The node values on each level are:Level 0:[1]Level 1:[10,4]Level 2:[3,7,9]Level 3:[12,8,6,2]Since levels 0 and 2 are all odd and increasing and levels 1 and 3 are all even and decreasing, the tree is Even-Odd.

Input: root =[5,4,2,3,3,7]Output: falseExplanation: The node values on each level are:Level 0:[5]Level 1:[4,2]Level 2:[3,3,7]Node values in level 2 must be in strictly increasing order, so the tree is not Even-Odd.

Input: root =[5,9,1,3,5,7]Output: falseExplanation: Node values in the level 1 should be even integers.
We can use BFS to traverse the tree level by level. For each level, we check the parity and order of the node values according to the problem’s rules: even-indexed levels must have strictly increasing odd values, and odd-indexed levels must have strictly decreasing even values.
classSolution {
public:bool isEvenOddTree(TreeNode* root) {
queue<TreeNode*> q;
q.push(root);
bool even = true;
while (!q.empty()) {
int sz = q.size();
int prev = even ? INT_MIN : INT_MAX;
for (int i =0; i < sz; ++i) {
TreeNode* node = q.front(); q.pop();
int v = node->val;
if (even) {
if (v %2==0|| v <= prev) return false;
} else {
if (v %2==1|| v >= prev) return false;
}
prev = v;
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
even =!even;
}
return true;
}
};
classSolution {
publicbooleanisEvenOddTree(TreeNode root) {
Queue<TreeNode> q =new LinkedList<>();
q.offer(root);
boolean even =true;
while (!q.isEmpty()) {
int sz = q.size();
int prev = even ? Integer.MIN_VALUE : Integer.MAX_VALUE;
for (int i = 0; i < sz; ++i) {
TreeNode node = q.poll();
int v = node.val;
if (even) {
if (v % 2 == 0 || v <= prev) returnfalse;
} else {
if (v % 2 == 1 || v >= prev) returnfalse;
}
prev = v;
if (node.left!=null) q.offer(node.left);
if (node.right!=null) q.offer(node.right);
}
even =!even;
}
returntrue;
}
}
classSolution:
defisEvenOddTree(self, root: 'TreeNode') -> bool:
from collections import deque
q = deque([root])
even =Truewhile q:
sz = len(q)
prev = float('-inf') if even else float('inf')
for _ in range(sz):
node = q.popleft()
v = node.val
if even:
if v %2==0or v <= prev:
returnFalseelse:
if v %2==1or v >= prev:
returnFalse prev = v
if node.left:
q.append(node.left)
if node.right:
q.append(node.right)
even =not even
returnTrue