LeetCode 第 993 题:二叉树的堂兄弟结点
传送门:993. 二叉树的堂兄弟节点
在二叉树中,根节点位于深度
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
提示:
- 二叉树的节点数介于
2
到100
之间。- 每个节点的值都是唯一的、范围为
1
到100
的整数。
思路:使用层序遍历,如果两个结点在同一层,它们就是堂兄弟结点。
因此如果当前层只能找到其中一个结点,那么说明它们位于不同层,肯定不是堂兄弟结点,可以直接返回 False
。
如果在同一层可以找到两个结点,要注意排除一种情况,那就是“这两个结点的父亲结点相同”。为此,可以做如下处理,在遍历的时候,如果遇到子结点是空结点的时候,设置一个占位的数值。因为题目后面的说明:“每个结点的值都是唯一的、范围为
1
1
1 到
100
100
100 的整数”。因此可以把空结点设置为一个不在
1
1
1 到
100
100
100 中间的数,例如
0
0
0。这样在层序遍历中检查,如果两个索引序号相邻,并且索引序号小的数是偶数,索引序号大的数是奇数,那么就表示它们的父结点相同,遇到这种情况,直接返回 False
,也不用往下看了。不是这种情况的话,可以返回 True
。
Python 代码:
# Definition for a binary tree node.
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def isCousins(self, root: 'TreeNode', x: 'int', y: 'int') -> 'bool':
if not root:
return False
queue = [root]
while queue:
# 循环开始时,队列中的元素个数就是当前层结点的个数
size = len(queue)
# 把一层的结点值都放进来,如果遇到空结点,放置 0,
# 题目中说"每个节点的值都是唯一的、范围为 1 到 100 的整数。"
# 所以,你放 101 都是可以的
cur_level = []
for _ in range(size):
top = queue.pop(0)
if top:
cur_level.append(top.val)
queue.append(top.left)
queue.append(top.right)
else:
cur_level.append(0)
# 如果这两个索引都在一层,只有一种情况需要排除
# 那就是两个结点挨着,并且索引小的结点的索引是偶数
if x in cur_level and y in cur_level:
index1 = cur_level.index(x)
index2 = cur_level.index(y)
if index1 > index2:
index1, index2 = index2, index1
if index1 + 1 == index2 and index1 & 1 == 0:
return False
return True
# 如果索引不在同一层,直接就可以返回不是堂兄弟结点了
if x in cur_level or y in cur_level:
return False
return False
提交结果:
(本节完)