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
| class Solution { public List<Integer> distanceK(TreeNode root, TreeNode target, int k) { Map<TreeNode, Integer> nodeDistance = new HashMap<>(); findNodesOnPathToTarget(root, target, nodeDistance); List<Integer> ans = new ArrayList<>(); dfs(root, nodeDistance.get(root), k, nodeDistance, ans); return ans; }
private int findNodesOnPathToTarget(TreeNode node, TreeNode target, Map<TreeNode, Integer> nodeDistance) { if (node == null) { return -1; } if (node == target) { nodeDistance.put(target, 0); return 0; } int left = findNodesOnPathToTarget(node.left, target, nodeDistance); if (left != -1) { nodeDistance.put(node, left + 1); return left + 1; } int right = findNodesOnPathToTarget(node.right, target, nodeDistance); if (right != -1) { nodeDistance.put(node, right + 1); return right + 1; } return -1; }
private void dfs(TreeNode node, int distance, int k, Map<TreeNode, Integer> nodeDistance, List<Integer> ans) { if (node == null) return; if (nodeDistance.containsKey(node)) { distance = nodeDistance.get(node); } if (distance == k) { ans.add(node.val); } dfs(node.left, distance + 1, k, nodeDistance, ans); dfs(node.right, distance + 1, k, nodeDistance, ans); } }
|