2
private Map<Integer, List<Integer>> getGraph(int[][] edges) {3
Map<Integer, List<Integer>> graph = new HashMap<>();4
for (int[] edge : edges) {5
graph.putIfAbsent(edge[0], new LinkedList<>());6
graph.putIfAbsent(edge[1], new LinkedList<>());8
graph.get(edge[0]).add(edge[1]);9
graph.get(edge[1]).add(edge[0]);15
public int[] sumOfDistancesInTree(int n, int[][] edges) {16
if (n < 2 || edges == null) {20
int[] countSubNodes = new int[n];21
Arrays.fill(countSubNodes, 1);22
int[] distances = new int[n];23
Map<Integer, List<Integer>> graph = getGraph(edges);25
postOrderTraversal(0, -1, countSubNodes, distances, graph);26
preOrderTraversal(0, -1, countSubNodes, distances, graph, n);31
private void postOrderTraversal(36
Map<Integer, List<Integer>> graph) {37
List<Integer> children = graph.get(node);39
for (int child : children) {40
if (child != parent) {41
postOrderTraversal(child, node, countSubNodes, distances, graph);42
countSubNodes[node] += countSubNodes[child];43
distances[node] += distances[child] + countSubNodes[child];48
private void preOrderTraversal(53
Map<Integer, List<Integer>> graph,55
List<Integer> children = graph.get(node);57
for (int child : children) {58
if (child != parent) {59
distances[child] = distances[node] + (n - countSubNodes[child]) - countSubNodes[child];60
preOrderTraversal(child, node, countSubNodes, distances, graph, n);