Harukaze

 

【力扣】奇偶树

来源:力扣(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是必要的。自己编程的时候也要注意。

 

posted on 2020-12-31 17:16  Harukaze  阅读(160)  评论(0)    收藏  举报

导航