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
44
45
46
47
48
49
50
51
52
53
|
// 863. All Nodes Distance K in Binary Tree
#include "leetcode.h"
/*
* given the 'root' of a binary tree, the value of a target node 'target', and
* an integer 'k', return an array of the values of all nodes that have a
* distance 'k' from the target node. you can return the answer in any order.
*/
class Solution {
void dfs(TreeNode *root, unordered_map<TreeNode *, TreeNode *> &back_edge,
TreeNode *target) {
if (!root || root == target)
return;
if (root->left) {
back_edge[root->left] = root;
dfs(root->left, back_edge, target);
}
if (root->right) {
back_edge[root->right] = root;
dfs(root->right, back_edge, target);
}
}
public:
vector<int> distanceK(TreeNode *root, TreeNode *target, int k) {
unordered_map<TreeNode *, TreeNode *> back_edge;
unordered_set<TreeNode *> visited;
vector<int> ans;
dfs(root, back_edge, target);
queue<TreeNode *> q;
q.push(target);
while (!q.empty() && k >= 0) {
int s = q.size();
while (s--) {
TreeNode *curr = q.front();
int val = curr->val;
q.pop();
visited.insert(curr);
if (!k)
ans.push_back(val);
if (!visited.count(back_edge[curr]) && back_edge[curr])
q.push(back_edge[curr]);
if (!visited.count(curr->left) && curr->left)
q.push(curr->left);
if (!visited.count(curr->right) && curr->right)
q.push(curr->right);
}
k--;
}
return ans;
}
};
|