classSolution{List<Integer> res =newArrayList<>();Map<TreeNode,TreeNode> childParentMap =newHashMap<>();Set<TreeNode> visited =newHashSet<>();publicList<Integer>distanceK(TreeNode root,TreeNode target,int k){// Build the children to parent mapfindParent(root);dfs(target, k);return res;}privatevoidfindParent(TreeNode node){if(node ==null){return;}if(node.left !=null){
childParentMap.put(node.left, node);findParent(node.left);}if(node.right !=null){
childParentMap.put(node.right, node);findParent(node.right);}}privatevoiddfs(TreeNode node,int k){// Base caseif(node ==null|| visited.contains(node))return;// Mark as visited
visited.add(node);if(k ==0){
res.add(node.val);return;}// Find through its childrendfs(node.left, k -1);dfs(node.right, k -1);// Find through its parentsdfs(childParentMap.get(node), k -1);return;}}