863. All Nodes Distance K in Binary Tree

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class Solution {
public List<Integer> distanceK(TreeNode root, TreeNode target, int k) {
Map<TreeNode, List<TreeNode>> nodeToNeighborList = new HashMap<>();
dfs(root, null, nodeToNeighborList);

List<Integer> numList = new ArrayList<>();
Set<TreeNode> visitedNodeSet = new HashSet<>();
dfs(target, k, nodeToNeighborList, visitedNodeSet, numList);
return numList;
}

private void dfs(TreeNode target, int k, Map<TreeNode, List<TreeNode>> nodeToNeighborList, Set<TreeNode> visitedNodeSet, List<Integer> numList) {
if (visitedNodeSet.contains(target)) {
return;
}

visitedNodeSet.add(target);
if (k == 0) {
numList.add(target.val);
return;
}

for (TreeNode neighbor : nodeToNeighborList.getOrDefault(target, Collections.emptyList())) {
dfs(neighbor, k - 1, nodeToNeighborList, visitedNodeSet, numList);
}
}

private void dfs(TreeNode node, TreeNode parent, Map<TreeNode, List<TreeNode>> nodeToNeighborList) {
if (node == null) {
return;
}

List<TreeNode> neighbors = nodeToNeighborList.computeIfAbsent(node, k -> new ArrayList<>());
if (parent != null) {
neighbors.add(parent);
}
if (node.left != null) {
neighbors.add(node.left);
dfs(node.left, node, nodeToNeighborList);
}
if (node.right != null) {
neighbors.add(node.right);
dfs(node.right, node, nodeToNeighborList);
}
}
}

References

863. All Nodes Distance K in Binary Tree