首页 > 试题广场 >

叶子删除计划

[编程题]叶子删除计划
  • 热度指数:473 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
小度给定你一棵拥有n个点的树,每次删去当前所有的叶子节点(即度数小于等于1的节点)和叶子节点所连接的边,直到所有的点都被删除了为止。
你需要对于每个点,求出它是第几次操作中被删除的。

输入描述:
第一行一个数字,表示树上节点个数 
接下来n - 1行,每行两个数字,表示树上的一条边。


输出描述:
一行n个数字,第i个数字表示节点i在第几次操作中被删除。
示例1

输入

5
1 2
1 3
2 4
2 5

输出

2 2 1 1 1
示例2

输入

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]);
    }
}

发表于 2021-09-25 15:21:55 回复(0)