【我也想刷穿 LeetCode啊】1609. 奇偶树

94 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

现在前端很多岗位面试需要有一定的算法基础,或者说经常刷算法的会优先考虑。

因此每天刷刷LeetCode非常有必要

在这之前我也刷过一些算法题,也希望以后也坚持刷,跟某掘友一样,我也想刷穿 LeetCode

一、题目描述

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

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

示例 1:

输入: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:

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

示例 3:

输入: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

二、思路分析

  • 层序遍历二叉树,将每层的结果,按层放到res
  • 再根据每层的下标,对每层进行相应的判断
  • 奇数下标,每个数要是偶数,且递减。否则返回false
  • 偶数下标,每个数要是奇数,且递增。否则返回false

三、代码实现

const isEvenOddTree = root => {
    // 二叉树层序遍历,按层放到res中
    const res = [];
    const q = [root];
    while (q.length) {
        let len = q.length;
        res.push([]);
        while (len--) {
            const n = q.shift();
            res[res.length - 1].push(n.val);
            n.left && q.push(n.left);
            n.right && q.push(n.right);
        }
    }
    // 遍历按层输出的结果,判断每层是否符合条件
    const n = res.length;
    for (let i = 0; i < n; i++) {
        if (i % 2) {
            // 奇数下标,每个数要是偶数,且递减
            if (!isEven(res[i])) return false;
        } else {
            // 偶数下标,每个数要是奇数,且递增
            if (!isOdd(res[i])) return false;
        }
    }
    return true;
};

// 满足奇数且递增
const isOdd = nums => {
    if (!(nums[0] % 2)) return false;
    const len = nums.length;
    for (let i = 1; i < len; i++) {
        if (!(nums[i] % 2) || nums[i] <= nums[i - 1]) return false;
    }
    return true;
};
// 满足偶数且递减
const isEven = nums => {
    if (nums[0] % 2) return false;
    const len = nums.length;
    for (let i = 1; i < len; i++) {
        if (nums[i] % 2 || nums[i] >= nums[i - 1]) return false;
    }
    return true;
};

四、总结

以上就是本道题的所有内容了,本系列会持续更,欢迎点赞、关注、收藏,另外如有其他的问题,欢迎下方留言给我,我会第一时间回复你,感谢~