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 的整数。
方法一:BFS
思路
对于 x 和 y,我们关心两个信息。
- 深度
- 父亲是谁
用一个长度为 2 的数组来存储着两个信息。角标 0 表示深度,角标 1 表示父亲的值。那么 是堂兄弟 的条件可以表示为 :xi[0] == yi[0] && xi[1] != yi[1]
。
通过 BFS 遍历整棵二叉树,同时用 HashMap 存储上述信息,map 的 key 为当前节点值,value 为上述信息(深度和父亲的值)。最后比较 x 和 y 信息即可。
参考代码
public boolean isCousins(TreeNode root, int x, int y) {
int level = 0;
Map<Integer, int[]> map = new HashMap<>();
map.put(root.val, new int[] {level, -1});
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
level++;
int len = queue.size();
for (int i = 0; i < len; i++) {
TreeNode node = queue.poll();
if (node.left != null) {
queue.offer(node.left);
map.put(node.left.val, new int[] {level, node.val});
}
if (node.right != null) {
queue.offer(node.right);
map.put(node.right.val, new int[] {level, node.val});
}
}
}
int[] xi = map.get(x), yi = map.get(y);
return xi[0] == yi[0] && xi[1] != yi[1];
}
执行结果