Leetcode 863. All Nodes Distance K in Binary Tree
You are given the root of a binary tree, a target node, and an integer k
. Return an array of the values of all nodes that have a distance k
from the target node.
The distance between two nodes is defined by the number of edges on the path from one to the other.
k
?
k
.k
. Include traversal up to parent nodes using the previously built parent reference map.import java.util.*;
public class Solution {
// TreeNode definition
static class TreeNode {
int val;
TreeNode left, right;
TreeNode(int x) { val = x; }
}
public List<Integer> distanceK(TreeNode root, TreeNode target, int k) {
Map<TreeNode, TreeNode> parentMap = new HashMap<>();
buildParentMap(root, null, parentMap);
Queue<TreeNode> queue = new LinkedList<>();
Set<TreeNode> visited = new HashSet<>();
queue.add(target);
visited.add(target);
int currentLevel = 0;
while (!queue.isEmpty()) {
if (currentLevel == k) {
List<Integer> result = new ArrayList<>();
for (TreeNode node : queue) {
result.add(node.val);
}
return result;
}
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode currentNode = queue.poll();
for (TreeNode neighbor : getNeighbors(currentNode, parentMap)) {
if (!visited.contains(neighbor)) {
visited.add(neighbor);
queue.add(neighbor);
}
}
}
currentLevel++;
}
return new ArrayList<>();
}
private void buildParentMap(TreeNode node, TreeNode parent, Map<TreeNode, TreeNode> parentMap) {
if (node != null) {
parentMap.put(node, parent);
buildParentMap(node.left, node, parentMap);
buildParentMap(node.right, node, parentMap);
}
}
private List<TreeNode> getNeighbors(TreeNode node, Map<TreeNode, TreeNode> parentMap) {
List<TreeNode> neighbors = new ArrayList<>();
if (node.left != null) neighbors.add(node.left);
if (node.right != null) neighbors.add(node.right);
if (parentMap.get(node) != null) neighbors.add(parentMap.get(node));
return neighbors;
}
public static void main(String[] args) {
// Example usage:
Solution solution = new Solution();
TreeNode root = new TreeNode(3);
root.left = new TreeNode(5);
root.right = new TreeNode(1);
root.left.left = new TreeNode(6);
root.left.right = new TreeNode(2);
root.right.left = new TreeNode(0);
root.right.right = new TreeNode(8);
root.left.right.left = new TreeNode(7);
root.left.right.right = new TreeNode(4);
TreeNode target = root.left; // target is the node with value 5
int k = 2;
System.out.println(solution.distanceK(root, target, k)); // Output: [7, 4, 1]
}
}
Overall Time Complexity: O(N)
Got blindsided by a question you didn’t expect?
Spend too much time studying?
Or simply don’t have the time to go over all 3000 questions?