给定一个二叉树(具有根结点 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.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/all-nodes-distance-k-in-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路: 根据 该二叉树,DFS建立邻接表,对该 邻接表,从 固定的节点 进行BFS
class Solution {
public:
int countV(TreeNode* root){
if(root==NULL)
return 0;
return 1 + countV(root->left) + countV(root->right);
}
void DFSlinjie(vector<vector<int>> &ljb,TreeNode* root){
if(root==NULL)
return ;
if(root->left!=NULL){
ljb[root->val].push_back(root->left->val);
ljb[root->left->val].push_back(root->val);
}
DFSlinjie(ljb,root->left);
if(root->right!=NULL){
ljb[root->val].push_back(root->right->val);
ljb[root->right->val].push_back(root->val);
}
DFSlinjie(ljb,root->right);
}
struct node{
int val;
int level;
};
vector<int> distanceK(TreeNode* root, TreeNode* target, int K) {vector<int> ans;
int v = countV(root);
if(v<K) return ans;
vector<vector<int>> ljb(v);
DFSlinjie(ljb,root);
queue<node> q;
node tmp;
tmp.val = target->val;
tmp.level = 0;
q.push(tmp);
vector<bool> flag(v,0);
flag[tmp.val] = true;
while(!q.empty()){
node now = q.front();
q.pop();
if(now.level > K)
break;
if(now.level == K)
ans.push_back(now.val);
for(int i=0;i<ljb[now.val].size();i++){
if(flag[ljb[now.val][i]] == false){
flag[ljb[now.val][i]] = true;
tmp.val = ljb[now.val][i];
tmp.level = now.level + 1;
q.push(tmp);
}
}
}
return ans;
}
};