难度中等358收藏分享切换为英文接收动态反馈
给定一个二叉树(具有根结点 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" 实际上是树上的结点。 上面的输入仅仅是对这些对象进行了序列化描述。
提示:
- 给定的树是非空的。
- 树上的每个结点都具有唯一的值
0 <= node.val <= 500
。 - 目标结点
target
是树上的结点。 0 <= K <= 1000
.
转换为图,然后求距离为k的点
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> vec[501];
typedef pair<int,int> P;
void dfs(TreeNode* root){
if(root){
if(root->left){
vec[root->val].push_back(root->left->val);
vec[root->left->val].push_back(root->val);
dfs(root->left);
}
if(root->right){
vec[root->val].push_back(root->right->val);
vec[root->right->val].push_back(root->val);
dfs(root->right);
}
}
}
vector<int> distanceK(TreeNode* root, TreeNode* target, int k) {
dfs(root);
queue<P> que;
que.push({target->val,k});
int vis[501] = {0};
vector<int> out;
while(que.size() != 0){
P p = que.front();
que.pop();
int x = p.first,len = p.second;
if(len == 0) out.push_back(x);
if(vis[x] == 1 || len < 0) continue;
vis[x] = 1;
for(int i = 0;i < vec[x].size();i++){
if(vis[vec[x][i]] == 0) que.push({vec[x][i],len - 1});
}
}
return out;
}
};