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;
    }
};