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;
};
四、总结
以上就是本道题的所有内容了,本系列会持续更,欢迎点赞、关注、收藏,另外如有其他的问题,欢迎下方留言给我,我会第一时间回复你,感谢~