/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
int n,m,h[1111],ne[2222],p[2222],d[1111][1111];
bool b[1111];//标记是否叶子结点
void add(int x,int y)
{
p[++m]=y;
ne[m]=h[x];
h[x]=m;
p[++m]=x;
ne[m]=h[y];
h[y]=m;
}
int dfs(TreeNode* root)
{
int r=n++,c;
b[r]=1;
if(root->left!=nullptr)
{
c=dfs(root->left);
add(r,c);
b[r]=0;
}
if(root->right!=nullptr)
{
c=dfs(root->right);
add(r,c);
b[r]=0;
}
return r;
}
void work(int x,int r,int f)
{
for(int i=h[x];i;i=ne[i])if(p[i]!=f)
{
d[r][p[i]]=d[r][x]+1;
work(p[i],r,x);
}
}
public:
int countPairs(TreeNode* root, int distance) {
n=m=0;
memset(h,0,sizeof(h));
memset(d,0,sizeof(d));
memset(b,0,sizeof(b));
dfs(root);
int i,j,ans;
for(i=0;i<n;i++)work(i,i,i);
for(i=0;i<n;i++)if(b[i])for(j=0;j<i;j++)if(b[j]&&d[i][j]<=distance)ans++;
return ans;
}
};