题目

类型:二叉树、深度优先搜索
image.png

解题思路

使用广度优先搜索,每一轮搜索访问同一层的全部节点,且只会访问这一层的节点。

使用队列存储节点。初始时,将根节点加入队列。每一轮搜索之前,队列中的节点是同一层的全部节点,记队列的大小为 size,该轮搜索只访问 size 个节点,即可保证该轮搜索访问的恰好是同一层的全部节点。搜索过程中,将当前层的节点的非空子节点依次加入队列,用于下一层的搜索。

判断一棵二叉树是否为奇偶树,需要考虑两个条件,一是节点值的奇偶性,二是节点值的单调性,这两个条件都由层下标的奇偶性决定。因此,需要维护搜索到的层下标,以及对于每一层搜索都需要维护上一个节点值。

如果当前层下标是偶数,则要求当前层的所有节点的值都是奇数,且节点值从左到右严格递增。如果遇到节点值是偶数,或者当前节点值小于等于上一个节点值,则二叉树一定不是奇偶树。
如果当前层下标是奇数,则要求当前层的所有节点的值都是偶数,且节点值从左到右严格递减。如果遇到节点值是奇数,或者当前节点值大于等于上一个节点值,则二叉树一定不是奇偶树。
如果二叉树的所有节点都满足奇偶树的条件,则二叉树是奇偶树。

代码

  1. class Solution {
  2. public boolean isEvenOddTree(TreeNode root) {
  3. Queue<TreeNode> queue = new ArrayDeque<TreeNode>();
  4. queue.offer(root);
  5. int level = 0;
  6. while (!queue.isEmpty()) {
  7. int size = queue.size();
  8. int prev = level % 2 == 0 ? Integer.MIN_VALUE : Integer.MAX_VALUE;
  9. for (int i = 0; i < size; i++) {
  10. TreeNode node = queue.poll();
  11. int value = node.val;
  12. if (level % 2 == value % 2) {
  13. return false;
  14. }
  15. if ((level % 2 == 0 && value <= prev) || (level % 2 == 1 && value >= prev)) {
  16. return false;
  17. }
  18. prev = value;
  19. if (node.left != null) {
  20. queue.offer(node.left);
  21. }
  22. if (node.right != null) {
  23. queue.offer(node.right);
  24. }
  25. }
  26. level++;
  27. }
  28. return true;
  29. }
  30. }