leetcode每日一题1609. 奇偶树 圣诞节你做奇偶数了没 BFS套模板一遍过

leetcode每日一题1609. 奇偶树 圣诞节你做奇偶数了没 BFS套模板一遍过~

写在前面

平安夜,挺平静的,只不过小付太过无聊了,但是就是睡不着,所幸就来刷题了,本来周六是休息的一天好不好,不过既然大家都没睡~那我也不好意思睡觉了,就来有了这篇圣诞节特别篇,其实也没啥特别的,毕竟咱们不推荐过洋节…

题目

  1. 奇偶树
如果一棵二叉树满足下述几个条件,则可以称为 奇偶树 :
二叉树根节点所在层下标为 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,虽然最近很忙但是小付还是会努力更新出最近所学的一门基础知识——这里先卖个关子 从下周开始哦~

最后

每天进步点 每天收获点

愿诸君 事业有成 学有所获

如果觉得不错 别忘啦一键三连哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alascanfu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值