Leetcode 993 Cousins in Binary Tree

在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。

如果二叉树的两个节点深度相同,但父节点不同,则它们是一对堂兄弟节点。

我们给出了具有唯一值的二叉树的根节点 root,以及树中两个不同节点的值 x 和 y。

只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true。否则,返回 false。

示例 1:
输入:root = [1,2,3,4], x = 4, y = 3
输出:false

示例 2:
输入:root = [1,2,3,null,4,null,5], x = 5, y = 4
输出:true

示例 3:
输入:root = [1,2,3,null,4], x = 2, y = 3
输出:false

提示:

  1. 二叉树的节点数介于 2 到 100 之间。
  2. 每个节点的值都是唯一的且范围为 1 到 100 的整数。

思路分析:
使用bfs算法对树进行遍历,在遍历过程中对每个节点进行存储,记录该节点所在的层数以及该节点的父节点

那么最后只要将x,y两个节点进行比较,观察层数是否相等,父节点是否不同即可!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution(object):
def isCousins(self, root, x, y):
Q = collections.deque([(root, 0)])
if root.val in (x,y): return False # early termination
level = 0
d = []
while Q:
for i in range(len(Q)):
node,level = Q.popleft()
if node.left:
if node.left.val in (x,y):
d.append((level+1, node))
Q.append((node.left, level+1))
if node.right:
if node.right.val in (x,y):
d.append((level+1, node))
Q.append((node.right, level+1))
level += 1
# judge if they have same level and different parents
return len(d) == 2 and d[0][0] == d[1][0] and d[0][1] != d[1][1]