【力扣时间】【1609】【中等】奇偶树

中等题中的简单题。
总之今天就快点过吧,树的遍历本身营养不大。
而且耽误我缅怀老大哥呢

1、惯例放题先

我在这
题目简洁明了,可以说没有一局废话。
而题意也很明晰,就是带了些规则的二叉树的遍历。

2、审题

题目没有陷阱,而在遍历树的同时加上的几点规则也很清楚,如下:

  1. 根据节点的深度的奇偶,会对节点值有不同的要求(根节点深度为0)
  2. 偶数深度节点的值必须为奇数,且严格递增
  3. 奇数深度节点的值必须为偶数,且严格递减

由于要比较每层深度的所有节点值,所以想必大家都会想到广度优先遍历吧。

3、思路

所以我就另辟蹊径!来一题深度优先遍历的!其实是没想到怎么做广度优先

对于树的深度遍历,大家应该都可以信手拈来。
辣么在此基础上,再加上给出的几个规则。
记录每个节点的深度,并判断其值的奇偶性,这都很简单。
关键是如何在深度优先的情况下,判断同一深度的节点间值的递增递减呢?

其实也很容易,我们都知道深度优先遍历的话,如果我们从左子树开始递归,辣么每一层的节点,都会从左到右访问到。我们并不需要连贯的比较每一层的值,仅需比较后一个和前一个的大小关系即可。
于是,我们只需记录下每一个深度的前一个节点的值,后续再访问此深度时,比较记录的值和当前值即可。

虽然可行,带在使用深度优先时就已经走歪了……

4、开工吧

class Solution {
    public boolean isEvenOddTree(TreeNode root) {
        Map<Integer, Integer> values = new HashMap<>();
        return check(root, values, 0);
    }

    private boolean check(TreeNode node, Map<Integer, Integer> values, int depth) {
        if (node == null) {
            return true;
        }

        //校验值
        if (depth % 2 == 0) {
            //如果深度为偶数,校验是否为奇数
            if (node.val % 2 == 0) {
                return false;
            }

            //如果深度为偶数,校验上一个此深度的节点值是否比自己小
            if (values.getOrDefault(depth, Integer.MIN_VALUE) >= node.val) {
                return false;
            }
        } else {
            //如果深度为奇数,校验是否为偶数
            if (node.val % 2 != 0) {
                return false;
            }

            //如果深度为奇数,校验上一个此深度的节点值是否比自己大
            if (values.getOrDefault(depth, Integer.MAX_VALUE) <= node.val) {
                return false;
            }
        }

        //更新此深度的节点值
        values.put(depth, node.val);

        //校验左右子树
        return check(node.left, values, depth + 1) & check(node.right, values, depth + 1);
    }
}

啊……我是怎么写出这么个玩意的啊

5、解读

所有逻辑都放在递归函数check()里了,思路很简单,大家应该都看得懂,所以就不多说了。
而且几乎每行都还有注释呢……

总之,大家还是看看后续贴出来的广度优先遍历的解法吧。

6、提交

在这里插入图片描述
我裂开了……

7、咀嚼

虽然是深度优先遍历,但依旧是每个节点仅遍历了一遍,时间复杂度为O(n)
空间的消耗在于节点的深度,而这里没有明确的标准,所以不考虑……

8、建议大家直接学习他人的

来了来了,写这篇感觉就是自我鄙视……

虽然大牛们的分享都不错,但简单易懂的BFS,看看官解就可以。

9、总结

仔细想想,我很少对树使用bfs啊,才导致今天写出了这么茬东西。
好吧,学习学习java中树的bfs写法。

不过,最重要的还是思想,其次才是实现的手段。
确保想法到位了,手段什么的甚至不用拘泥于语言。

最后,再缅怀下逝去的老大哥。
老大哥有他的坏,但也有他的好。
而死去的老大哥才是好的老大哥。所以我们只要缅怀,千万不要让它回来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值