classSolution{public:vector<int>distanceK(TreeNode*root,TreeNode*target,intK){vector<int>ans;unordered_map<TreeNode*,int>nodeToDist;// {node: distance to target}getDists(root,target,nodeToDist);dfs(root,K,0,nodeToDist,ans);returnans;}private:voidgetDists(TreeNode*root,TreeNode*target,unordered_map<TreeNode*,int>&nodeToDist){if(root==nullptr)return;if(root==target){nodeToDist[root]=0;return;}getDists(root->left,target,nodeToDist);if(nodeToDist.count(root->left)){// The target is in the left subtreenodeToDist[root]=nodeToDist[root->left]+1;return;}getDists(root->right,target,nodeToDist);if(nodeToDist.count(root->right))// The target is in the right subtreenodeToDist[root]=nodeToDist[root->right]+1;}voiddfs(TreeNode*root,intK,intdist,unordered_map<TreeNode*,int>&nodeToDist,vector<int>&ans){if(root==nullptr)return;if(nodeToDist.count(root))dist=nodeToDist[root];if(dist==K)ans.push_back(root->val);dfs(root->left,K,dist+1,nodeToDist,ans);dfs(root->right,K,dist+1,nodeToDist,ans);}};
classSolution{publicList<Integer>distanceK(TreeNoderoot,TreeNodetarget,intK){List<Integer>ans=newArrayList<>();Map<TreeNode,Integer>nodeToDist=newHashMap<>();// {node: distance to target}getDists(root,target,nodeToDist);dfs(root,K,0,nodeToDist,ans);returnans;}privatevoidgetDists(TreeNoderoot,TreeNodetarget,Map<TreeNode,Integer>nodeToDist){if(root==null)return;if(root==target){nodeToDist.put(root,0);return;}getDists(root.left,target,nodeToDist);if(nodeToDist.containsKey(root.left)){// The target is in the left subtreenodeToDist.put(root,nodeToDist.get(root.left)+1);return;}getDists(root.right,target,nodeToDist);if(nodeToDist.containsKey(root.right))// The target is in the right subtreenodeToDist.put(root,nodeToDist.get(root.right)+1);}privatevoiddfs(TreeNoderoot,intK,intdist,Map<TreeNode,Integer>nodeToDist,List<Integer>ans){if(root==null)return;if(nodeToDist.containsKey(root))dist=nodeToDist.get(root);if(dist==K)ans.add(root.val);dfs(root.left,K,dist+1,nodeToDist,ans);dfs(root.right,K,dist+1,nodeToDist,ans);}}