给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 k 。

    返回到目标结点 target 距离为 k 的所有结点的值的列表。 答案可以以 任何顺序 返回。

    示例 1:

    输入:root = [3,5,1,6,2,0,8,null,null,7,4], target = 5, k = 2
    输出:[7,4,1]
    解释:所求结点为与目标结点(值为 5)距离为 2 的结点,值分别为 7,4,以及 1
    示例 2:

    输入: root = [1], target = 1, k = 3
    输出: []

    提示:

    节点数在 [1, 500] 范围内
    0 <= Node.val <= 500
    Node.val 中所有值 不同
    目标结点 target 是树上的结点。
    0 <= k <= 1000


    1. class Solution {
    2. static int N = 510;
    3. int[] h = new int[N];
    4. int[] e = new int[N*4], ne = new int[N*4];
    5. int idx;
    6. private void add(int x, int y) {
    7. e[idx] = y; ne[idx] = h[x]; h[x] = idx++;
    8. }
    9. boolean[] vis = new boolean[N];
    10. public List<Integer> distanceK(TreeNode root, TreeNode target, int k) {
    11. List<Integer> res = new ArrayList<>();
    12. Arrays.fill(h, -1);
    13. dfs(root);
    14. Deque<Integer> q = new LinkedList<>();
    15. q.addLast(target.val);
    16. vis[target.val] = true;
    17. while (!q.isEmpty() && k >= 0) {
    18. int size = q.size();
    19. while (size -- > 0) {
    20. int t = q.pollFirst();
    21. //如果为0就不扩展了
    22. if (k == 0) {
    23. res.add(t);
    24. continue;
    25. }
    26. for (int i = h[t]; i != -1; i = ne[i]) {
    27. int j = e[i];
    28. if (!vis[j]) {
    29. q.add(j);
    30. vis[j] = true;
    31. }
    32. }
    33. }
    34. k--;
    35. }
    36. return res;
    37. }
    38. private void dfs(TreeNode root) {
    39. if (root == null) return;
    40. if (root.left != null) {
    41. add(root.val, root.left.val);
    42. add(root.left.val, root.val);
    43. dfs(root.left);
    44. }
    45. if (root.right != null) {
    46. add(root.val, root.right.val);
    47. add(root.right.val, root.val);
    48. dfs(root.right);
    49. }
    50. }
    51. }