def nodes_at_k_hops(root: TreeNode, target: TreeNode, k: int) -> List[int]:
parent_node = {}
def create_parent_node(parent, node):
if node:
parent_node[node] = parent
create_parent_node(node, node.left)
create_parent_node(node, node.right)
create_parent_node(None, root)
# BFS
visited = set()
queue = deque([(target, k)])
answers = []
while queue:
node, distance = queue.popleft()
if not node or node in visited:
continue
visited.add(node)
if distance == 0:
answers.append(node.val)
continue
queue.append((node.left, distance - 1))
queue.append((node.right, distance - 1))
queue.append((parent_node[node], distance - 1))
return answers