题目难度:简单
题目描述:
在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。
如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。
我们给出了具有唯一值的二叉树的根节点 root ,以及树中两个不同节点的值 x 和 y 。
只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true 。否则,返回 false。
DFS(+纪录式搜索)
class Solution {
TreeNode parent1 = null;
TreeNode parent2 = null;
int floor1 = 0;
int floor2 = 0;
public boolean isCousins(TreeNode root, int x, int y) {
dfs(root, null, 0, x, y);
return floor1==floor2 && parent1!=parent2;
}
public void dfs(TreeNode root, TreeNode parent, int floor, int x, int y){
if (null==root) return;
if (root.val == x){
parent1 = parent;
floor1 = floor;
}
if (root.val == y){
parent2 = parent;
floor2 = floor;
}
dfs(root.left, root, floor+1, x, y);
dfs(root.right, root, floor+1, x, y);
}
}
官解不是很优雅,就不看了
高手写法 (BFS)
public boolean isCousins(TreeNode root, int x, int y) {
Deque<TreeNode[]> q = new LinkedList<>();
q.offer(new TreeNode[]{root, null});
while (!q.isEmpty()) {
int size = q.size();
int fx = 0, fy = 0;
TreeNode[] candidates = new TreeNode[2];
for (int i = 0; i < size; i++) {
TreeNode[] poll = q.poll();
TreeNode cur = poll[0], parent = poll[1];
if (cur.val == x) {
fx = 1;
candidates[0] = parent;
} else if (cur.val == y) {
fy = 1;
candidates[1] = parent;
}
if (cur.left != null) q.offer(new TreeNode[]{cur.left, cur});
if (cur.right != null) q.offer(new TreeNode[]{cur.right, cur});
}
if (fx == 0 && fy == 0) continue;
if ((fx ^ fy) == 1) return false;
if ((fx & fy) == 1) return candidates[0] != candidates[1];
}
return false;
}