题目描述
给定一个二叉树(具有根结点 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 注意,输入的 "root" 和 "target" 实际上是树上的结点。 上面的输入仅仅是对这些对象进行了序列化描述。
提示:
- 给定的树是非空的,且最多有
K
个结点。 - 树上的每个结点都具有唯一的值
0 <= node.val <= 500
。 - 目标结点
target
是树上的结点。 0 <= K <= 1000
.
解题思路:
将树转换成图,然后对图进行BFS的同时,记录当前层数
vector<int> G[505];
int vis[505];
vector<int> ans;
void tree_conv_graph(TreeNode* root){
if(root != NULL){
if(root->left != NULL){
G[root->val].push_back(root->left->val);
G[root->left->val].push_back(root->val);
}
if(root->right != NULL){
G[root->val].push_back(root->right->val);
G[root->right->val].push_back(root->val);
}
tree_conv_graph(root->left);
tree_conv_graph(root->right);
}
}
void BFS(int s,int K){
vis[s] = 1;
queue<int> que;
int pre = s,k = 0;
que.push(s);
while(!que.empty()){
int u = que.front();
que.pop();
for(int i=0;i<G[u].size();i++){
int v = G[u][i];
if(vis[v] == 0){
vis[v] = 1;
que.push(v);
}
}
if(pre == u){
k++;
pre = que.back();
if(k == K){
while(!que.empty()){
ans.push_back(que.front());
que.pop();
}
return;
}
}
}
}
vector<int> distanceK(TreeNode* root, TreeNode* target, int K) {
memset(vis,0,sizeof(vis));
tree_conv_graph(root);
if(K == 0) ans.push_back(target->val);
else BFS(target->val,K);
return ans;
}