# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
from collections import deque
class Solution:
def isEvenOddTree(self, root: Optional[TreeNode]) -> bool:
if not root:
return True
q = deque()
q.append(root)
level = 0
while q:
size = len(q)
prev_val = None
for _ in range(size):
node = q.popleft()
# Check parity condition
if level % 2 == 0:
# Even level: values must be odd and strictly increasing
if node.val % 2 == 0:
return False
if prev_val is not None and node.val <= prev_val:
return False
else:
# Odd level: values must be even and strictly decreasing
if node.val % 2 == 1:
return False
if prev_val is not None and node.val >= prev_val:
return False
prev_val = node.val
if node.left:
q.append(node.left)
if node.right:
q.append(node.right)
level += 1
return True
// Definition for a binary tree node.
// struct TreeNode {
// int val;
// TreeNode *left;
// TreeNode *right;
// TreeNode(int x) : val(x), left(NULL), right(NULL) {}
// };
#include <queue>
class Solution {
public:
bool isEvenOddTree(TreeNode* root) {
if (!root) return true;
std::queue<TreeNode*> q;
q.push(root);
int level = 0;
while (!q.empty()) {
int size = q.size();
int prev_val = (level % 2 == 0) ? INT_MIN : INT_MAX;
for (int i = 0; i < size; ++i) {
TreeNode* node = q.front(); q.pop();
if (level % 2 == 0) {
// Even level: odd and strictly increasing
if (node->val % 2 == 0 || node->val <= prev_val)
return false;
} else {
// Odd level: even and strictly decreasing
if (node->val % 2 == 1 || node->val >= prev_val)
return false;
}
prev_val = node->val;
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
++level;
}
return true;
}
};
// Definition for a binary tree node.
// public class TreeNode {
// int val;
// TreeNode left;
// TreeNode right;
// TreeNode(int x) { val = x; }
// }
import java.util.*;
class Solution {
public boolean isEvenOddTree(TreeNode root) {
if (root == null) return true;
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);
int level = 0;
while (!q.isEmpty()) {
int size = q.size();
int prevVal = (level % 2 == 0) ? Integer.MIN_VALUE : Integer.MAX_VALUE;
for (int i = 0; i < size; i++) {
TreeNode node = q.poll();
if (level % 2 == 0) {
// Even level: odd, strictly increasing
if (node.val % 2 == 0 || node.val <= prevVal)
return false;
} else {
// Odd level: even, strictly decreasing
if (node.val % 2 == 1 || node.val >= prevVal)
return false;
}
prevVal = node.val;
if (node.left != null) q.offer(node.left);
if (node.right != null) q.offer(node.right);
}
level++;
}
return true;
}
}
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {boolean}
*/
var isEvenOddTree = function(root) {
if (!root) return true;
let queue = [root];
let level = 0;
while (queue.length > 0) {
let size = queue.length;
let prevVal = level % 2 === 0 ? -Infinity : Infinity;
for (let i = 0; i < size; i++) {
let node = queue.shift();
if (level % 2 === 0) {
// Even level: odd, strictly increasing
if (node.val % 2 === 0 || node.val <= prevVal) return false;
} else {
// Odd level: even, strictly decreasing
if (node.val % 2 === 1 || node.val >= prevVal) return false;
}
prevVal = node.val;
if (node.left) queue.push(node.left);
if (node.right) queue.push(node.right);
}
level++;
}
return true;
};
You are given the root of a binary tree. The tree is called an Even Odd Tree if it satisfies the following conditions:
true
if the tree is an Even Odd Tree, and false
otherwise.
Constraints:
To solve this problem, we need to check two properties at every level of the binary tree:
We use Breadth-First Search (BFS) to traverse the tree level by level. Here’s the step-by-step approach:
true
. If any check fails, return false
immediately.
We use a variable to keep track of the previous value at each level, resetting it at the start of each new level. For even levels, we initialize this to negative infinity (since we want strictly increasing values), and for odd levels to positive infinity (since we want strictly decreasing values).
Let's walk through an example with the following tree:
1 / \ 10 4 / \ 3 7
true
.
Brute-force approach: If we tried to collect all nodes at each level, sort them, and check the order, this would be O(N log N) per level, which is inefficient for large trees.
Optimized BFS approach:
The Even Odd Tree problem is efficiently solved using a level-order traversal (BFS), checking each level's node values for both parity and strict ordering. By keeping track of the previous value at each level and using a queue to traverse the tree, we ensure all constraints are met in a single pass. This approach is both intuitive and optimal, making good use of BFS to process the tree level by level.