863. 二叉树中所有距离为 K 的结点(中等)(题目链接:https://leetcode-cn.com/problems/all-nodes-distance-k-in-binary-tree/)
给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 K 。
返回到目标结点 target 距离为 K 的所有结点的值的列表。 答案可以以任何顺序返回。
题意比较明确,给定树中的一个节点,找出与这个节点距离为k的所有节点.
两种思路:第一种是遍历整棵树,找哪些节点与目标节点距离为k,由于需要从子节点往父节点遍历,故需要提前处理,用map存下每个节点的父节点,再维护数组vis,避免重复遍历某些节点
AC代码:
class Solution {
public:
unordered_map<int,TreeNode*>mp;
bool vis[505];
vector<int>res;
int find(TreeNode* root){
if(root->left!=NULL) mp[root->left->val]=root,find(root->left);
if(root->right!=NULL) mp[root->right->val]=root,find(root->right);
return 0;
}
int srch(TreeNode *root,int cnt,int k){
vis[root->val]=1;
if(root==NULL) return 0;
if(cnt==k) {
res.push_back(root->val);
return 0;
}
if(mp.find(root->val)!=mp.end()&&!vis[mp[root->val]->val]) srch(mp[root->val],cnt+1,k);
if(root->left!=NULL&&!vis[root->left->val]) srch(root->left,cnt+1,k);
if(root->right!=NULL&&!vis[root->right->val]) srch(root->right,cnt+1,k);
return 0;
}
vector<int> distanceK(TreeNode* root, TreeNode* target, int k) {
find(root);
srch(target,0,k);
return res;
}
};
第二种思路:将树转化为一张普通图,从目标节点开始进行广度搜索.
AC代码:
class Solution {
public:
vector<int>mp[505];
vector<int>res;
int build(TreeNode* root){
if(root->left!=NULL){
mp[root->left->val].push_back(root->val);
mp[root->val].push_back(root->left->val);
build(root->left);
}
if(root->right!=NULL){
mp[root->right->val].push_back(root->val);
mp[root->val].push_back(root->right->val);
build(root->right);
}
return 0;
}
int BFS(int start,int k){
bool vis[505]={0};
queue<pair<int,int>>q;
q.push({start,0});
vis[start]=1;
while (q.size())
{
pair tmp=q.front();
q.pop();
if(tmp.second==k) {
res.push_back(tmp.first);
continue;
}
for(auto &v:mp[tmp.first]){
if(!vis[v]) {
vis[v]=1;
q.push({v,tmp.second+1});
}
}
}
return 0;
}
vector<int> distanceK(TreeNode* root, TreeNode* target, int k) {
build(root);
BFS(target->val,k);
return res;
}
};