小度给定你一棵拥有n个点的树,每次删去当前所有的叶子节点(即度数小于等于1的节点)和叶子节点所连接的边,直到所有的点都被删除了为止。
你需要对于每个点,求出它是第几次操作中被删除的。
第一行一个数字,表示树上节点个数
接下来n - 1行,每行两个数字,表示树上的一条边。
一行n个数字,第i个数字表示节点i在第几次操作中被删除。
5 1 2 1 3 2 4 2 5
2 2 1 1 1
4 1 2 1 3 1 4
2 1 1 1
import java.util.*;
public class Main{
public static class Node{ //静态内部类
public List<Node> list= new ArrayList<>(); //树除根节点就一个父啊,是图的话就可以多个,用Node类型的list存
public int num = 0; //存节点的度,用List.size()方法更新很麻烦,remove后size和索引也变了
boolean flag = false; //节点是否删除
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int count = n;
int time = 1;
int[] res = new int[n+1];
Node[] nodes = new Node[n+1];
for(int i = 0; i < n+1; ++i){ //Node[]初始化必要
Node node = new Node();
nodes[i] = node;
}
while(sc.hasNext()){ //相当于 for(int i = 0; i < n-1; i++)
int a = sc.nextInt();
int b = sc.nextInt();
nodes[a].list.add(nodes[b]);
nodes[b].list.add(nodes[a]); //数组下标即是节点号,不用属性value了
nodes[a].num++;
nodes[b].num++;
}
while(count > 0){
List<Node> levelNode = new ArrayList<>(); //存这次删除的节点
for( int i = 1; i < n+1; ++i){ //不能从0开始
//定义:树入度<=1(根节点是0,其他都是1),叶子节点出度=0。故叶子节点的度<=1且没有删除就该删除
if(nodes[i].num <= 1 && !nodes[i].flag){
res[i] = time;
nodes[i].flag = true;
levelNode.add(nodes[i]); //将被删除的节点加入链表,在后面的遍历里更新
count--;
}
}
//将这次删除的节点的关联节点的数据更新
for(Node node : levelNode){
for(Node i : node.list)
i.num--;
}
time++;
}
for( int i = 1; i < n; ++i){
System.out.print(res[i]+" "); //输出示例有空格要求
}
System.out.print(res[n]);
}
}