给定一个二叉树(具有根结点 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” 实际上是树上的结点。
上面的输入仅仅是对这些对象进行了序列化描述。
提示:
1.给定的树是非空的。
2.树上的每个结点都具有唯一的值 0 <= node.val <= 500 。
3.目标结点 target 是树上的结点。
4.0 <= K <= 1000.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/all-nodes-distance-k-in-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:树转图,需要记录每个节点的父节点指针。map
实现。
/**
* 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:
unordered_map<TreeNode*,TreeNode*> parent;
vector<int> distanceK(TreeNode* root, TreeNode* target, int K) {
vector<int>res;
if(K == 0)
{
res.push_back(target->val);
return res;
}
DFS(root,NULL);//建立父子联系
queue<TreeNode*> Q;
Q.push(target);//target结点入队 从target节点开始向外延伸
unordered_set<TreeNode*> visited;
visited.insert(target);
int step = 0;
while(!Q.empty())
{
step++;
for(int i = Q.size()-1;i>=0;--i)
{
TreeNode* temp = Q.front();
Q.pop();
if(temp->left && !visited.count(temp->left))//不重复访问
{
if(step == K)
{
res.push_back(temp->left->val);
}
Q.push(temp->left);
visited.insert(temp->left);
}
if(temp->right && !visited.count(temp->right))
{
if(step == K)
{
res.push_back(temp->right->val);
}
Q.push(temp->right);
visited.insert(temp->right);
}
if(parent[temp]&&!visited.count(parent[temp]))//针对父亲节点遍历
{
if(step == K)
{
res.push_back(parent[temp]->val);
}
Q.push(parent[temp]);
visited.insert(parent[temp]);
}
}
if(step == K)
break;
}
return res;
}
void DFS(TreeNode* root,TreeNode* pre)//树转图
{
if(!root)
return;
if(root)
parent.insert({root,pre});
DFS(root->left,root);
DFS(root->right,root);
}
};