方法一:BFS
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isEvenOddTree(TreeNode root) {
Deque<TreeNode> queue = new LinkedList<>();
int level = 0;
if (root == null) return true;
queue.addLast(root);
while (!queue.isEmpty()) {
int size = queue.size();
int pre = level % 2 == 0 ? Integer.MIN_VALUE : Integer.MAX_VALUE;
while (size != 0) {
TreeNode node = queue.pollFirst();
if (level % 2 == 0 && (node.val % 2 == 0 || node.val <= pre)) return false;
if (level % 2 != 0 && (node.val % 2 != 0 || node.val >= pre)) return false;
pre = node.val;
if (node.left != null) queue.addLast(node.left);
if (node.right != null) queue.addLast(node.right);
size--;
}
level++;
}
return true;
}
}
方法二:DFS
class Solution {
Map<Integer, Integer> map = new HashMap<>();
public boolean isEvenOddTree(TreeNode root) {
return dfs(root, 0);
}
boolean dfs(TreeNode root, int idx) {
boolean flag = idx % 2 == 0;
int prev = map.getOrDefault(idx, flag ? 0 : 0x3f3f3f3f), cur = root.val;
if (flag && (cur % 2 == 0 || cur <= prev)) return false;
if (!flag && (cur % 2 != 0 || cur >= prev)) return false;
map.put(idx, root.val);
if (root.left != null && !dfs(root.left, idx + 1)) return false;
if (root.right != null && !dfs(root.right, idx + 1)) return false;
return true;
}
}