leetcode每日一题1609. 奇偶树 圣诞节你做奇偶数了没 BFS套模板一遍过~
写在前面
平安夜,挺平静的,只不过小付太过无聊了,但是就是睡不着,所幸就来刷题了,本来周六是休息的一天好不好,不过既然大家都没睡~那我也不好意思睡觉了,就来有了这篇圣诞节特别篇,其实也没啥特别的,毕竟咱们不推荐过洋节…
题目
- 奇偶树
如果一棵二叉树满足下述几个条件,则可以称为 奇偶树 :
二叉树根节点所在层下标为 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 层上的节点值应为偶数。
提示
树中节点数在范围 [1, 10^5] 内
1 <= Node.val <= 10^6
思路
//你只需要记住所有的BFS的题都能依靠模板来完成
public void traverse(TreeNode root){
if (root == null) return ;
//初始化队列,将root加入队列中
Queue<TreeNode> q = new ArrayDeque<>();
q.offer(root);
while (!q.isEmpty()){
TreeNode cur = q.poll();
/*层级遍历代码的位置*/
System.out.println(root.val);
/******************/
if(cur.left!= null){
q.offer(cur.left);
}
if(cur.right!= null){
q.offer(cur.right);
}
}
}
上述代码是标准的二叉树层级遍历框架,从上到下,由左到右打印每一层二叉树节点的值,到了这里你在看这道题,是不是简单了很多,唯一增加的区别就在于当前这一层是奇数层还是偶数层用一个even变量来记录,随后偶数层是否是依次递减,奇数层是否依次递增,当此层判定完成后,变量even取反即为odd层,如果条件都满足,这无疑是一颗奇偶树。
代码实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isEvenOddTree(TreeNode root) {
boolean even = true;
Deque<TreeNode> q = new ArrayDeque<>();
q.offerLast(root);
while (!q.isEmpty()){
int pre = even ? 0 : 1000000;
for (int i = 0 ,n=q.size();i< n;i++){
TreeNode node = q.pollFirst();
if (even && (pre >= node.val || node.val %2 == 0)){
return false;
}
if (!even && (pre <= node.val || node.val % 2 == 1)){
return false;
}
pre = node.val;
if (node.left!= null){
q.offerLast(node.left);
}
if (node.right != null){
q.offerLast(node.right);
}
}
even = !even;
}
return true;
}
}
执行结果
写在最后
接近双百 真不错 圣诞节的特殊篇就到这里了哦
可以安心睡个好觉了 今日提前打卡成功~
明天的话适度卷一下,因为要陪重要的人一起过玩~
emmm,虽然最近很忙但是小付还是会努力更新出最近所学的一门基础知识——这里先卖个关子 从下周开始哦~
最后
每天进步点 每天收获点
愿诸君 事业有成 学有所获
如果觉得不错 别忘啦一键三连哦~