开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情
奇偶树
如果一棵二叉树满足下述几个条件,则可以称为 奇偶树 :
- 二叉树根节点所在层下标为 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
提示:
- 树中节点数在范围
[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;
};
最后
如果有更好的解法或者思路, 欢迎在评论区和我交流~ ღ( ´・ᴗ・` )