题目:
代码:
import java.util.Scanner;
public class Main {
/*
* 思路:
测试数据
4
1 2
1 3
2 4
正常输出:
3 1 0 0
* */
static int n;//家谱中的总人数
static int[][] g;//存放家谱(2列分别表示父母、孩子)
static int[] ans;//存放每个人的直系后代数
static int cnt=0;//当前人的后代数
static boolean[] flag;//标记是不是孩子,如果是孩子,为true
public static void main(String[] args){
//1.输出相关值
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();//n
g = new int[n-1][2];
ans = new int[n+1];
flag = new boolean[n+1];
for(int i=0;i<n-1;i++) {
g[i][0] = sc.nextInt();
g[i][1] = sc.nextInt();
flag[g[i][1]] =true;
}//for
//2.找到根祖先
int root=0;
for(int i=1;i<=n;i++) {
if(!flag[i]) {//根节点
root=i;
}
}
//2.深度优先遍历,从根节点开始进行遍历
dfs(root);
for(int i=1;i<=n;i++) {
System.out.print(ans[i]+" ");
}
}
private static int dfs(int root) {
int cnt=0;
for(int i=0;i<g.length;i++) {//遍历所有祖先为root的情况
if(g[i][0]==root) {
cnt+=dfs(g[i][1]);
}
}
ans[root]=cnt;
return cnt+1;
}
}