Cousins in Binary Tree
Advertisement
Problem
Two nodes are cousins if they are at the same depth but have different parents. Return true if x and y are cousins.
Solutions
# Python
from collections import deque
def isCousins(root, x, y):
q = deque([(root, None)])
while q:
found = {}
for _ in range(len(q)):
node, parent = q.popleft()
if node.val == x: found[x] = parent
if node.val == y: found[y] = parent
if node.left: q.append((node.left, node.val))
if node.right: q.append((node.right, node.val))
if len(found) == 2:
return found[x] != found[y]
if len(found) == 1:
return False
return False
// C++
bool isCousins(TreeNode* root, int x, int y) {
queue<pair<TreeNode*,int>> q; q.push({root,-1});
while (!q.empty()) {
int xpar=-2,ypar=-3,sz=q.size();
while(sz--){auto[node,par]=q.front();q.pop();
if(node->val==x)xpar=par; if(node->val==y)ypar=par;
if(node->left)q.push({node->left,node->val}); if(node->right)q.push({node->right,node->val});}
if(xpar!=-2&&ypar!=-3)return xpar!=ypar;
if(xpar!=-2||ypar!=-3)return false;
}
return false;
}
// Java
public boolean isCousins(TreeNode root, int x, int y) {
Queue<int[]> q = new LinkedList<>(); // [val, parent]
q.add(new int[]{root.val, -1});
Map<Integer, TreeNode> nodeMap = new HashMap<>();
nodeMap.put(root.val, root);
// Simplified BFS
Queue<TreeNode[]> queue = new LinkedList<>();
queue.add(new TreeNode[]{root, null});
while (!queue.isEmpty()) {
int xPar = Integer.MIN_VALUE, yPar = Integer.MAX_VALUE, sz = queue.size();
while (sz-- > 0) {
TreeNode[] pair = queue.poll();
TreeNode node = pair[0]; int par = pair[1] == null ? -1 : pair[1].val;
if (node.val == x) xPar = par;
if (node.val == y) yPar = par;
if (node.left != null) queue.add(new TreeNode[]{node.left, node});
if (node.right != null) queue.add(new TreeNode[]{node.right, node});
}
if (xPar != Integer.MIN_VALUE && yPar != Integer.MAX_VALUE) return xPar != yPar;
if (xPar != Integer.MIN_VALUE || yPar != Integer.MAX_VALUE) return false;
}
return false;
}
// JavaScript
function isCousins(root, x, y) {
let queue = [[root, null]];
while (queue.length) {
let xPar, yPar;
const next = [];
for (const [node, par] of queue) {
if (node.val === x) xPar = par;
if (node.val === y) yPar = par;
if (node.left) next.push([node.left, node.val]);
if (node.right) next.push([node.right, node.val]);
}
if (xPar !== undefined && yPar !== undefined) return xPar !== yPar;
if (xPar !== undefined || yPar !== undefined) return false;
queue = next;
}
return false;
}
Complexity
- Time: O(n), Space: O(n)
Advertisement