Cousins in Binary Tree

Sanjeev SharmaSanjeev Sharma
2 min read

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

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro