LeetCode Everyday - 奇偶树

86 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情

奇偶树

如果一棵二叉树满足下述几个条件,则可以称为 奇偶树

  • 二叉树根节点所在层下标为 0 ,根的子节点所在层下标为 1 ,根的孙节点所在层下标为 2 ,依此类推。
  • 偶数下标 层上的所有节点的值都是 整数,从左到右按顺序 严格递增
  • 奇数下标 层上的所有节点的值都是 整数,从左到右按顺序 严格递减 给你二叉树的根节点,如果二叉树为 奇偶树 ,则返回 true ,否则返回 false 。

示例1:

image.png

输入:root = [1,10,4,3,null,7,9,12,8,6,null,null,2]
输出:true
解释:每一层的节点值分别是:
0 层:[1]
1 层:[10,4]
2 层:[3,7,9]
3 层:[12,8,6,2]
由于 0 层和 2 层上的节点值都是奇数且严格递增,而 1 层和 3 层上的节点值都是偶数且严格递减,因此这是一棵奇偶树。

示例2:

image.png

输入:root = [5,4,2,3,3,7]
输出:false
解释:每一层的节点值分别是:
0 层:[5]
1 层:[4,2]
2 层:[3,3,7]
2 层上的节点值不满足严格递增的条件,所以这不是一棵奇偶树。

示例3:

image.png

输入: root = [5,9,1,3,5,7]
输出: false
解释: 1 层上的节点值应为偶数。

示例4:

输入: root = [1]
输出: true

示例5:

输入: root = [11,8,6,1,3,9,11,30,20,18,16,12,10,4,2,17]
输出: true

提示:

  • 树中节点数在范围 [1, 105] 内
  • 1 <= Node.val <= 106

解题思路:

根据奇偶树的性质. 我们针对第i(奇数)层逐个元素遍历, 判断其从左至右是否严格递减 且每项为偶数 我们针对第j(偶数)层逐个元素遍历, 判断其从左至右是否严格递增 且每项为奇数 若满足上述,则符合题意. 因为逐层遍历, 故我们采取BFS最为合适.判断每层是否符合条件即可

我的答案:

/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isEvenOddTree = function (root) {
  const isOddNum = (num) => !!(num % 2);

  let queue = [root];
  let depth = 0;
  while (queue.length) {
    const isOdd = isOddNum(depth);
    const nextQueue = [];

    let prev = queue.shift();
    if (prev.left) nextQueue.push(prev.left);
    if (prev.right) nextQueue.push(prev.right);
    if ((isOdd && isOddNum(prev.val)) || (!isOdd && !isOddNum(prev.val)))
      return false;

    for (const node of queue) {
      if (isOdd) {
        if (isOddNum(node.val)) return false;
        if (node.val >= prev.val) return false;
      } else {
        if (!isOddNum(node.val)) return false;
        if (node.val <= prev.val) return false;
      }
      if (node.left) nextQueue.push(node.left);
      if (node.right) nextQueue.push(node.right);
      prev = node;
    }
    depth++;
    queue = nextQueue;
  }
  return true;
};

最后

如果有更好的解法或者思路, 欢迎在评论区和我交流~ ღ( ´・ᴗ・` )