863. All Nodes Distance K in Binary Tree
time: buildGraph: O(n) + bfs: O(n) = O(n)
space: O(n)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> distanceK(TreeNode root, TreeNode target, int k) {
List<Integer> res = new ArrayList<>();
if (root == null) {
return res;
}
Map<TreeNode, List<TreeNode>> map = new HashMap<>();
buildGraph(root, null, map);
if (!map.containsKey(target)) { // no target
return res;
}
return bfs(map, target, k, res);
}
// do BFS
private List<Integer> bfs(Map<TreeNode, List<TreeNode>> map, TreeNode target, int k, List<Integer> res) {
Set<TreeNode> visited = new HashSet<>();
Queue<TreeNode> queue = new ArrayDeque<>();
visited.add(target);
queue.offer(target);
while (!queue.isEmpty()) {
int size = queue.size();
for (int i = 0; i < size; i++) {
if (k == 0) {
while (!queue.isEmpty()) {
res.add(queue.poll().val);
}
return res;
}
TreeNode curr = queue.poll();
for (TreeNode node : map.get(curr)) {
if (visited.contains(node)) {
continue;
}
visited.add(node);
queue.offer(node);
}
}
k--;
}
return res;
}
private void buildGraph(TreeNode node, TreeNode parent, Map<TreeNode, List<TreeNode>> map) {
if (node == null) {
return;
}
map.computeIfAbsent(node, n -> new ArrayList<>());
if (parent != null) { // build graph with parent and children
map.get(node).add(parent);
map.get(parent).add(node);
}
buildGraph(node.left, node, map);
buildGraph(node.right, node, map);
}
}new version
之前是建map 時把 parent , left, right 都建立
這裡只建立 parent, 其他 left, right 當跑BFS在加入(比較省空間!
Previous2096. Step-By-Step Directions From a Binary Tree Node to AnotherNext652. Find Duplicate Subtrees
Last updated
Was this helpful?