做了半天愣是0%,發(fā)帖記錄(Java)節(jié)點類:class Node { int val; List<Node> neighbor = new ArrayList<>(); boolean visited;}思路:1. 先獲取到所有邊,存到節(jié)點數(shù)組中;2. 已知根節(jié)點為“1”,使用廣度優(yōu)先或者層式遍歷方式遍歷;3. 遍歷時注意判斷當(dāng)前節(jié)點的neighbor是否已被訪問(即為父節(jié)點),排除父節(jié)點后則可知子節(jié)點數(shù)量;代碼實踐:import java.util.ArrayList;import java.util.HashSet;import java.util.List;import java.util.Set;import java.util.stream.Collectors;class Node { int val; List<Node> neighbor = new ArrayList<>(); public Node(int val) { this.val = val; }}public class T2 { public static void main(String[] args) {// Scanner in = new Scanner(System.in);// int T = in.nextInt(); int T = 1; int[] ns = new int[]{7}; int[][] bs = new int[][]{ {1, 2}, {1, 3}, {3, 5}, {3, 7}, {2, 4}, {2, 6} }; for (int i = 0; i < T; i++) { long res = 0;// int n = in.nextInt(); int n = ns[i]; Node[] nodeArr = new Node[n]; for (int j = 0; j < n - 1; j++) { int u = bs[j][0]; int v = bs[j][1]; if (nodeArr[u - 1] == null) { nodeArr[u - 1] = new Node(u - 1); } if (nodeArr[v - 1] == null) { nodeArr[v - 1] = new Node(v - 1); } nodeArr[u - 1].neighbor.add(nodeArr[v - 1]); nodeArr[v - 1].neighbor.add(nodeArr[u - 1]); } int[] count = new int[3]; count[nodeArr[0].neighbor.size()]++; Set<Integer> visited = new HashSet<>(); visited.add(nodeArr[0].val); List<Node> curNodes = nodeArr[0].neighbor; List<Node> tmpNodes = new ArrayList<>(); while (curNodes.size() > 0) { for (Node node : curNodes) { visited.add(node.val); List<Node> nextNodes = node.neighbor.stream().filter(nodeTmp -> !visited.contains(nodeTmp.val)).collect(Collectors.toList()); int childNum = nextNodes.size(); count[childNum]++; tmpNodes.addAll(nextNodes); } curNodes = tmpNodes; tmpNodes = new ArrayList<>(); } for (int c: count) { res += getPairCount(c); } System.out.println(res); } } static long getPairCount(int n) { if (n <= 1) { return 0; } return (long) n * (n - 1) / 2; }}