1004 Counting Leaves(30 分)
A family hierarchy is usually presented by a pedigree tree. Your job is to count those family members who have no child.
Input Specification:
Each input file contains one test case. Each case starts with a line containing 0~100, the number of nodes in a tree, and M (< N), the number of non-leaf nodes. Then M lines follow, each in the format:
ID K ID[1] ID[2] ID[K]
where ID is a two-digit number representing a given non-leaf node, K is the number of its children, followed by a sequence of two-digit ID’s of its children. For the sake of simplicity, let us fix the root ID to be 01.
The input ends with N being 0. That case must NOT be processed.
Output Specification:
For each test case, you are supposed to count those family members who have no child for every seniority level starting from the root. The numbers must be printed in a line, separated by a space, and there must be no extra space at the end of each line.
The sample case represents a tree with only 2 nodes, where 01 is the root and 02 is its only child. Hence on the root 01 level, there is 0 leaf node; and on the next level, there is 1leaf node. Then we should output 0 1 in a line.
Sample Input:
2 1
01 1 02
Sample Output:
0 1
answer
import java.util.*; /** * Created by Boolean on 2018/8/8. */ public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int numbers = scanner.nextInt(); int num_noleaf = scanner.nextInt(); int i = 0; int[] levels = new int[numbers]; DNode[] nodes = new DNode[numbers]; levels[0] = 0; int max_level=0; for(i=0;i<numbers;i++) { DNode dNode = new DNode(i); nodes[i] = dNode; } while(num_noleaf>0) { int vertext = scanner.nextInt(); int num_child = scanner.nextInt(); LinkedList<BNode> bNodes = new LinkedList<>(); while (num_child-->0) { int child = scanner.nextInt(); BNode newNode = new BNode(child-1); bNodes.add(newNode); levels[child-1] = levels[vertext-1]+1; if(levels[child-1]>max_level) max_level = levels[child-1]; } nodes[vertext-1].setBList(bNodes); num_noleaf--; } BFS(nodes,numbers,levels,max_level); DFS(nodes,numbers,levels,max_level); } static class DNode{ private int vertex; private LinkedList<BNode> BList; DNode(int vertex,LinkedList<BNode> BList) { this.vertex = vertex; this.BList = BList; } public DNode(int vertex) { this.vertex = vertex; } public void setBList(LinkedList<BNode> BList){ this.BList = BList; } } private static class BNode{ private int vertex; private Boolean hasChild = false; BNode(int vertex){ this.vertex = vertex; } } //广度遍历算法 private static void BFS(DNode[] dNodes,int numbers,int[] levels,int sum_level) { Queue<DNode> queue = new LinkedList<>();//辅助队列 Boolean[] visited = new Boolean[numbers];//记录结点是否被访问过 int[] res = new int[100];//结果集 for(int i=0;i<numbers;i++)visited[i]=false; visited[0] = true; queue.offer(dNodes[0]);//根结点入队,若是图,则函数参数需要加vertex作为起始结点 if(dNodes[0].BList==null){System.out.printf("1");return;}//只有一个根结点 else System.out.printf("0"); //队列为空则完成遍历 while (!queue.isEmpty()) { DNode dNode = queue.poll(); int index = 0; //遍历所有邻接结点 while (dNode.BList!=null&&index<dNode.BList.size()) { int child_ver = dNode.BList.get(index).vertex; if(!visited[child_ver]) { if(dNodes[child_ver].BList==null){ visited[child_ver]=true;//leaf-node++ res[levels[child_ver]]++; } else { visited[child_ver] = true; queue.offer(dNodes[child_ver]);//入队列 } } index++; } } //输出leaf-node数 for(int i=1;i<=sum_level;i++) { System.out.printf(" %d",res[i]); } } }
//深度遍历
private static void DFS(DNode[] dNodes,int numbers,int[] levels,int sum_level)
{
DNode dNode = dNodes[0];//根结点
Boolean[] visited = new Boolean[numbers];
for(int i=0;i<numbers;i++)visited[i]=false;
int[] res = new int[numbers];
//dfs遍历
dfs_fun(dNode,visited,dNodes,levels,res);
//根结点是否为空
if(dNode.BList!=null) System.out.printf("0");
else System.out.printf("1");
//输出结果集
for(int i=1;i<=sum_level;i++) System.out.printf(" %d",res[i]);
}
private static void dfs_fun(DNode vertex,Boolean[] visited,DNode[] dNodes,int[] levels,int[] res)
{
visited[vertex.vertex] = true;
int index = 0;
//遍历邻接结点
for(int i=0;vertex.BList!=null&&i<vertex.BList.size();i++)
{
int node = vertex.BList.get(index).vertex;
if(!visited[node])
{
index++;
if(dNodes[node].BList==null){ res[levels[node]]++;}
//递归调用
dfs_fun(dNodes[node],visited,dNodes,levels,res);
}
}
}