【力扣】奇偶树
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/even-odd-tree
如果一棵二叉树满足下述几个条件,则可以称为 奇偶树 :
二叉树根节点所在层下标为 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 层上的节点值都是偶数且严格递减,因此这是一棵奇偶树。
Python对树结构的处理没怎么接触过,直接看大佬的代码学习下,思路考虑使用广度优先搜索:
1 # Definition for a binary tree node. 2 # class TreeNode: 3 # def __init__(self, val=0, left=None, right=None): 4 # self.val = val 5 # self.left = left 6 # self.right = right 7 class Solution: 8 def isEvenOddTree(self, root: TreeNode) -> bool: 9 if not root: 10 return False 11 12 queue = [] 13 queue.append(root) 14 depth = 0 #树的深度 15 flag = True 16 while queue: 17 tmp=[] 18 for i in range(len(queue)-1): #判断是否按照偶数层递增,奇数层递减 19 if depth % 2 != 0: 20 if queue[i].val <= queue[i+1].val: 21 flag = False 22 else: 23 if queue[i].val >= queue[i+1].val: 24 flag = False 25 for node in queue: 26 if node.val % 2 == depth % 2: #遍历所有节点判断node的值和深度奇偶性是否不同 27 flag = False 28 if node.left: 29 tmp.append(node.left) #把下一层左子节点加加入到队列中 30 if node.right: 31 tmp.append(node.right) #把下一层右子节点加加入到队列中 32 depth += 1 33 queue=tmp 34 35 return flag 36 作者:terry-r 37 链接:https://leetcode-cn.com/problems/even-odd-tree/solution/pythonyan-du-you-xian-sou-suo-jie-jue-qi-ou-shu-by/ 38 来源:力扣(LeetCode)
解题思路:利用BFS广度优先搜索,每一层遍历所有nodes,并且判断是否符合奇偶树的条件,判断完成后进入下一层,直到最后一层结束循环。
假设输入:root = [1,10,4,3,null,7,9,12,8,6,null,null,2]
1)开始queue.append(root),树根元素入队,range(len(queue)-1) = [ ],不执行第一个for循环,进入第二个for循环,判断所有元素node的值和深度奇偶性是否不同,如果相同则不满足题意,flag = False,如果只有根节点一个元素,则tmp列表中无元素,再赋值给queue,推出循环,程序返回结果。我们的输入1,满足题目要求,1的左右孩子[10,4],均添加到queue的列表中,深度加一
2)range(len(queue)-1) = [0],执行第一个fort循环,判断是否按照偶数层递增,奇数层递减
i = 0,depth = 1,奇数层: 满足递减性质,不满足if语句 queue[0].val < =queue[1].val
node取值[10,4],遍历所有节点判断node的值和深度奇偶性是否不同,如果相同则不满足题意,flag = False
把queue中的节点的左右孩子都加入到tmp列表中,再送给queue,depth加一,重复上述过程。
需要注意在设置i的取值范围的时候,循环体中考虑使用$i$与下一个元素$i+1$进行比较,所以为了不超出列表的范围,len(queue)-1是必要的。自己编程的时候也要注意。
浙公网安备 33010602011771号