Here is the solution:
subtree_size = array of size n
function dfs(node, p):
subtree_size[node] = 1
for child in adj[node]:
if child != p:
dfs(child, node)
subtree_size[node] = subtree_size[node] + subtree_size[child]
After running dfs(root, -1), subtree_size[i] holds the size of the subtree rooted at . The number of subordinates is subtree_size[i] - 1.
This runs in time and uses space.