class Solution {
public:
unordered_map<int,TreeNode*>parent;
vector<int>ans;
TreeNode* t;
void findParent(TreeNode* root)
{
if(root->left)
{
parent[root->left->val]=root;
findParent(root->left);
}
if(root->right)
{
parent[root->right->val]=root;
findParent(root->right);
}
}
void findAns(TreeNode* root,TreeNode* from,int d,int k)
{
if(!root)
return;
if(d==k)
{
ans.emplace_back(root->val);
return;
}
if(root->left!=from)
findAns(root->left,root,d+1,k);
if(root->right!=from)
findAns(root->right,root,d+1,k);
if(parent[root->val]!=from)
findAns(parent[root->val],root,d+1,k);
}
void findTarget(TreeNode* root,int target)
{
if(!root)
return;
findTarget(root->left,target);
findTarget(root->right,target);
if(root->val==target)
{
t=root;
return;
}
}
vector<int> distanceKnodes(TreeNode* root, int target, int k) {
findParent(root);
findTarget(root,target);
findAns(t,NULL,0,k);
return ans;
}
};