Tips:该专栏的题解整理在https://github.com/dzw001/leetcode_notebook,有需要的童鞋自取哦~
题目链接
https://leetcode-cn.com/problems/even-odd-tree/
题目描述
题目难度:中等
如果一棵二叉树满足下述几个条件,则可以称为 奇偶树 :
- 二叉树根节点所在层下标为
0
,根的子节点所在层下标为1
,根的孙节点所在层下标为2
,依此类推。 - 偶数下标 层上的所有节点的值都是 奇 整数,从左到右按顺序 严格递增
- 奇数下标 层上的所有节点的值都是 偶 整数,从左到右按顺序 严格递减
给你二叉树的根节点,如果二叉树为 奇偶树 ,则返回 true
,否则返回 false
。
解题思路
二叉树的层次遍历,只需根据题目所给定的规则,在遍历每一层时加以判定即可,若不符合则返回 False
,若成功遍历完,则返回 True
。
若整数 n
为奇数,则 (n % 2 - 0.5) > 0
;若整数 n
为偶数,则 (n % 2 - 0.5) < 0
。因此我在这里用了 (layer % 2 - 0.5) * (p.val % 2 - 0.5) < 0
来一并判断 奇数层上的节点是否为偶数 以及 偶数层上的节点是否为奇数。用 ((layer % 2 - 0.5) * (p.val - last_node_val)) <= 0
来一并判断 奇数层是否严格递增 以及 偶数层是否严格递减。
# Python3
class Solution:
def isEvenOddTree(self, root: Optional[TreeNode]) -> bool:
if root.val % 2 == 0:
return False
queue = [root]
layer = 1
while queue:
last_node_val = None
length = len(queue)
for i in range(length):
p = queue.pop(0)
if p.left is not None:
queue.append(p.left)
if p.right is not None:
queue.append(p.right)
if (layer % 2 - 0.5) * (p.val % 2 - 0.5) < 0:
return False
if last_node_val is not None and ((layer % 2 - 0.5) * (p.val - last_node_val)) <= 0:
return False
last_node_val = p.val
layer += 1
return True
layer += 1
return True