题目
如果一棵二叉树满足下述几个条件,则可以称为 奇偶树 :
二叉树根节点所在层下标为 0 ,根的子节点所在层下标为 1 ,根的孙节点所在层下标为 2 ,依此类推。
偶数下标 层上的所有节点的值都是 奇 整数,从左到右按顺序 严格递增
奇数下标 层上的所有节点的值都是 偶 整数,从左到右按顺序 严格递减
给你二叉树的根节点,如果二叉树为 奇偶树 ,则返回 true ,否则返回 false 。
解题思路
BFS和DFS都可以写,DFS有递归会涉及到重复遍历的过程,BFS的优势就体现出来了。但这里只贴了DFS的解法,练一手递归。
DFS遍历过程中,把层数也加到状态中,先判断奇偶性,再用一个数组来维护每一层从左到右上一个节点的值,对其进行比较。
BFS遍历过程中,对每个节点层数予以层数状态,也是先判断奇偶性,再用数组来维护每一层从左到右上一个节点的值,对其进行比较。
代码
class Solution {
private Map<Integer, Integer> map = new HashMap<>();
public boolean isEvenOddTree(TreeNode root) {
return dfs(root, 0);
}
private boolean dfs(TreeNode root, int deep) {
if (root == null) return true;
if ((deep + root.val) % 2 != 1) return false;
if (deep % 2 == 0) {
int pre = map.getOrDefault(deep, 0);
if (root.val <= pre) return false;
else map.put(deep, root.val);
} else {
int pre = map.getOrDefault(deep, Integer.MAX_VALUE);
if (root.val >= pre) return false;
else map.put(deep, root.val);
}
return dfs(root.left, deep + 1) && dfs(root.right, deep + 1);
}
}