中等题中的简单题。
总之今天就快点过吧,树的遍历本身营养不大。
而且耽误我缅怀老大哥呢
1、惯例放题先
我在这
题目简洁明了,可以说没有一局废话。
而题意也很明晰,就是带了些规则的二叉树的遍历。
2、审题
题目没有陷阱,而在遍历树的同时加上的几点规则也很清楚,如下:
- 根据节点的深度的奇偶,会对节点值有不同的要求(根节点深度为0)
- 偶数深度节点的值必须为奇数,且严格递增
- 奇数深度节点的值必须为偶数,且严格递减
由于要比较每层深度的所有节点值,所以想必大家都会想到广度优先遍历吧。
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写法。
不过,最重要的还是思想,其次才是实现的手段。
确保想法到位了,手段什么的甚至不用拘泥于语言。
最后,再缅怀下逝去的老大哥。
老大哥有他的坏,但也有他的好。
而死去的老大哥才是好的老大哥。所以我们只要缅怀,千万不要让它回来。