We’re asked to return the values of the nodes that are distance k from a given target node. We can accomplish this by conducting a DFS through the binary tree to assign each node a parent node. This allows us to treat the binary tree as an undirected graph.
With this updated graph, we can condcut a BFS from the target node outwards, conducting k steps. Once we’ve done k steps, we return the values of the nodes still remaining in the queue - these are the nodes at the level that are k distance away from the target.
The solution is as follows:
class Solution:
def distanceK(self, root: TreeNode, target: TreeNode, k: int) -> List[int]:
stack = [(root, None)]
while stack:
node, parent = stack.pop()
node.parent = parent
if node.left:
stack.append((node.left, node))
if node.right:
stack.append((node.right, node))
distance = 0
seen = {target}
queue = [target]
while queue and distance < k:
curr_queue, queue = queue, []
for node in curr_queue:
for neighbor in [node.left, node.right, node.parent]:
if neighbor and neighbor not in seen:
seen.add(neighbor)
queue.append(neighbor)
distance += 1
return [node.val for node in queue]
_ Time Complexity:
O(n) - DFS and BFS both take O(n) time.
_ Space Complexity:
O(n) - We maintain a stack, queue, and seen set that all take up O(n) space.