class Node: def __init__(self, key): self.key = key self.left = None self.right = None def find_level_and_parent(root, target, level=0, parent=None): if root is None: return None if root.key == target: return (level, parent) left = find_level_and_parent(root.left, target, level + 1, root) if left: return left return find_level_and_parent(root.right, target, level + 1, root) def find_cousins(root, target): if root is None or root.key == target: return [] target_info = find_level_and_parent(root, target) if not target_info: return [] target_level, target_parent = target_info cousins = [] queue = [(root, 0, None)] # (node, level, parent) while queue: node, level, parent = queue.pop(0) if level == target_level and parent != target_parent: cousins.append(node.key) if node.left: queue.append((node.left, level + 1, node)) if node.right: queue.append((node.right, level + 1, node)) return cousins