题目
在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。
如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。
我们给出了具有唯一值的二叉树的根节点 root ,以及树中两个不同节点的值 x 和 y 。
只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true 。否则,返回 false。
卡点
这道题我想到了使用bfs遍历树并且去记录深度,但有两点未思考到
深度记录的方式应该是和节点绑定,即每个节点应该有自己的深度变量。我试图通过一个变量记录深度,结果难以通过队列的变化确定(应该可以通过遍历前记录队列中节点数量,然后for循环遍历完成后对全局深度+1)
dfs和bfs都可以在遍历前去获取到父节点信息,而且是要在对节点进行操作之前,bfs是在入队列前,而我在思考的时候是思考的节点进入队列后如何判断它的父节点。当然这里也可以判断,如果我不使用队列,而是使用一个数据,元素不停的加入,而元素的pop是通过移动一个队首的指针完成,那么我就可以通过下标运算得到父节点的值,但这样内存消耗会大一些。
答案
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
# dfs
class Solution:
def isCousins(self, root: Optional[TreeNode], x: int, y: int) -> bool:
queue = []
queue.append((root,0))
x_found, x_parent, x_deep = False, None, -1
y_found, y_parent, y_deep = False, None, -1
while len(queue) > 0:
node, parent_deep = queue.pop(0)
if node.left != None:
if node.left.val == x:
x_found = True
x_parent = node
x_deep = parent_deep + 1
elif node.left.val == y:
y_found = True
y_parent = node
y_deep = parent_deep + 1
queue.append((node.left, parent_deep+1))
if node.right != None:
if node.right.val == x:
x_found = True
x_parent = node
x_deep = parent_deep + 1
elif node.right.val == y:
y_found = True
y_parent = node
y_deep = parent_deep + 1
queue.append((node.right, parent_deep+1))
if x_found and y_found:
break
return x_found and y_found and x_deep == y_deep and x_parent != y_parent