classSolution{public:intfindClosestLeaf(TreeNode*root,intk){intans=-1;intminDist=1000;// {node: distance to TreeNode(k)}unordered_map<TreeNode*,int>nodeToDist;getDists(root,k,nodeToDist);getClosestLeaf(root,0,nodeToDist,minDist,ans);returnans;}private:voidgetDists(TreeNode*root,intk,unordered_map<TreeNode*,int>&nodeToDist){if(root==nullptr)return;if(root->val==k){nodeToDist[root]=0;return;}getDists(root->left,k,nodeToDist);if(nodeToDist.count(root->left)){// The TreeNode(k) is in the left subtreenodeToDist[root]=nodeToDist[root->left]+1;return;}getDists(root->right,k,nodeToDist);if(nodeToDist.count(root->right))// The TreeNode(k) is in the right subtreenodeToDist[root]=nodeToDist[root->right]+1;}voidgetClosestLeaf(TreeNode*root,intdist,unordered_map<TreeNode*,int>&nodeToDist,int&minDist,int&ans){if(root==nullptr)return;if(nodeToDist.count(root))dist=nodeToDist[root];if(root->left==nullptr&&root->right==nullptr){// Is leafif(dist<minDist){minDist=dist;ans=root->val;}return;}getClosestLeaf(root->left,dist+1,nodeToDist,minDist,ans);getClosestLeaf(root->right,dist+1,nodeToDist,minDist,ans);}};
classSolution{publicintfindClosestLeaf(TreeNoderoot,intk){ans=-1;minDist=1000;// {node: distance to TreeNode(k)}Map<TreeNode,Integer>nodeToDist=newHashMap<>();getDists(root,k,nodeToDist);getClosestLeaf(root,0,nodeToDist);returnans;}privateintans;privateintminDist;privatevoidgetDists(TreeNoderoot,intk,Map<TreeNode,Integer>nodeToDist){if(root==null)return;if(root.val==k){nodeToDist.put(root,0);return;}getDists(root.left,k,nodeToDist);if(nodeToDist.containsKey(root.left)){// The TreeNode(k) is in the left subtreenodeToDist.put(root,nodeToDist.get(root.left)+1);return;}getDists(root.right,k,nodeToDist);if(nodeToDist.containsKey(root.right))// The TreeNode(k) is in the right subtreenodeToDist.put(root,nodeToDist.get(root.right)+1);}privatevoidgetClosestLeaf(TreeNoderoot,intdist,Map<TreeNode,Integer>nodeToDist){if(root==null)return;if(nodeToDist.containsKey(root))dist=nodeToDist.get(root);if(root.left==null&&root.right==null){if(dist<minDist){minDist=dist;ans=root.val;}return;}getClosestLeaf(root.left,dist+1,nodeToDist);getClosestLeaf(root.right,dist+1,nodeToDist);}}