All Nodes Distance K in Binary Tree (LC863)

  27 May 2019

By Wen Xu

leetcode algorithm depth first search binary tree

Problem description

We are given a binary tree (with root node root), a target node, and an integer value K.

Return a list of the values of all nodes that have a distance K from the target node. The answer can be returned in any order.

Example 1:

Input: root = [3,5,1,6,2,0,8,null,null,7,4], target = 5, K = 2

Output: [7,4,1]

Explanation: The nodes that are a distance 2 from the target node (with value 5) have values 7, 4, and 1.

alt sketch 0

Note that the inputs “root” and “target” are actually TreeNodes. The descriptions of the inputs above are just serializations of these objects.

Note:

The given tree is non-empty. Each node in the tree has unique values 0 <= node.val <= 500. The target node is a node in the tree. 0 <= K <= 1000.

Solution

  1. We can first use DFS to add a parent attr to all the tree nodes.
  2. Then we can use a second DFS to find all the nodes that have K distance from target.

Below is my python implementation

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def distanceK(self, root, target, K):
        """
        :type root: TreeNode
        :type target: TreeNode
        :type K: int
        :rtype: List[int]
        """
        ans = []
        
        def dfs1(root, parent)->None:#add parent attr to the tree node
            if root == None:
                return
            root.parent = parent
            dfs1(root.left, root)
            dfs1(root.right, root)
            return
        
        visited = {}
        
        def dfs2(node, K)->None:
            if not node:
                return
            visited[node] = True
            if K == 0:
                ans.append(node.val)
            if node.left not in visited:
                dfs2(node.left, K - 1)
            if node.right not in visited:
                dfs2(node.right, K - 1)
            if node.parent not in visited:
                dfs2(node.parent, K - 1)
            return
        
        dfs1(root, None)
        dfs2(target, K)
        return ans
				
comments powered by Disqus