Skip to content

Commit d87826b

Browse files
author
lennart
committed
switch to List<List<Integer>> for tree
1 parent e96043f commit d87826b

2 files changed

Lines changed: 32 additions & 34 deletions

File tree

src/main/java/com/thealgorithms/tree/CentroidDecomposition.java

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -29,19 +29,18 @@
2929
*/
3030

3131
public class CentroidDecomposition {
32-
private final List<Integer>[] tree;
33-
private final List<Integer>[] centroidTree;
32+
private final List<List<Integer>> tree;
33+
private final List<List<Integer>> centroidTree;
3434
private int[] subtreeSizes;
3535
private boolean[] visited;
3636
private boolean[] centroidMarked;
3737
private int[] centroidParent;
3838
private int startingNode;
3939
private final int n;
4040

41-
@SuppressWarnings("unchecked")
4241
public CentroidDecomposition(int n, int startingNode) {
43-
this.tree = (List<Integer>[]) new ArrayList<?>[n];
44-
this.centroidTree = (List<Integer>[]) new ArrayList<?>[n];
42+
this.tree = new ArrayList<>();
43+
this.centroidTree = new ArrayList<>();
4544
this.n = n;
4645
centroidMarked = new boolean[n];
4746
centroidParent = new int[n];
@@ -53,8 +52,8 @@ public CentroidDecomposition(int n, int startingNode) {
5352
this.startingNode = startingNode;
5453
for (int i = 0; i < n; i++) {
5554
centroidParent[i] = -1;
56-
tree[i] = new ArrayList<>();
57-
centroidTree[i] = new ArrayList<>();
55+
tree.add(new ArrayList<>());
56+
centroidTree.add(new ArrayList<>());
5857
}
5958
}
6059

@@ -69,7 +68,7 @@ public void build() {
6968

7069
public void reset() {
7170
for (int i = 0; i < n; i++) {
72-
centroidTree[i].clear();
71+
centroidTree.get(i).clear();
7372
centroidParent[i] = -1;
7473
subtreeSizes[i] = 0;
7574
centroidMarked[i] = false;
@@ -86,17 +85,17 @@ public int[] getSubtreeSizes() {
8685
}
8786

8887
public void addEdgeTree(int u, int v) {
89-
tree[u].add(v);
90-
tree[v].add(u);
88+
tree.get(u).add(v);
89+
tree.get(v).add(u);
9190
}
9291

9392
private void addEdgeCTree(int u, int v) {
94-
centroidTree[u].add(v);
95-
centroidTree[v].add(u);
93+
centroidTree.get(u).add(v);
94+
centroidTree.get(v).add(u);
9695
centroidParent[v] = u;
9796
}
9897

99-
public List<Integer>[] getCentroidTree() {
98+
public List<List<Integer>> getCentroidTree() {
10099
return centroidTree;
101100
}
102101

@@ -105,7 +104,7 @@ public int getParent(int v) {
105104
}
106105

107106
public List<Integer> getCentroidChildren(int v) {
108-
return centroidTree[v].stream().filter(child -> centroidParent[child] == v && centroidParent[v] != child).collect(Collectors.toList());
107+
return centroidTree.get(v).stream().filter(child -> centroidParent[child] == v && centroidParent[v] != child).collect(Collectors.toList());
109108
}
110109

111110
public int getRoot() {
@@ -120,7 +119,7 @@ public int getRoot() {
120119
public void findSubtreeSizes(int src) {
121120
visited[src] = true;
122121
subtreeSizes[src] = 1;
123-
for (int node : tree[src]) {
122+
for (int node : tree.get(src)) {
124123
if (!visited[node] && !centroidMarked[node]) {
125124
visited[node] = true;
126125
findSubtreeSizes(node);
@@ -135,7 +134,7 @@ public void findCentroid(int src, int previousCentroid) {
135134
int treeSize = subtreeSizes[src];
136135
int heavyChild = -1;
137136

138-
for (int node : tree[src]) {
137+
for (int node : tree.get(src)) {
139138
if (centroidMarked[node]) {
140139
continue;
141140
}
@@ -156,7 +155,7 @@ public void findCentroid(int src, int previousCentroid) {
156155
addEdgeCTree(previousCentroid, src);
157156
}
158157

159-
for (int node : tree[src]) {
158+
for (int node : tree.get(src)) {
160159
if (!centroidMarked[node]) {
161160
findCentroid(node, src);
162161
}

src/test/java/com/thealgorithms/tree/CentroidDecompositionTest.java

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -136,10 +136,10 @@ void buildSetsExpectedParentsForKeyNodes() {
136136
@Test
137137
void centroidAdjacencyFor8And11MatchesIgnoringOrder() {
138138
cd.build();
139-
List<Integer>[] cg = cd.getCentroidTree();
139+
List<List<Integer>> cg = cd.getCentroidTree();
140140

141-
List<Integer> actual8 = new ArrayList<>(cg[8]);
142-
List<Integer> actual11 = new ArrayList<>(cg[11]);
141+
List<Integer> actual8 = new ArrayList<>(cg.get(8));
142+
List<Integer> actual11 = new ArrayList<>(cg.get(8));
143143

144144
List<Integer> expected8 = Arrays.asList(0, 3, 9, 10);
145145
List<Integer> expected11 = Arrays.asList(0, 2, 12, 14);
@@ -158,9 +158,9 @@ void resetClearsCentroidData() {
158158
cd.build();
159159
cd.reset();
160160

161-
List<Integer>[] cg = cd.getCentroidTree();
162-
for (int i = 0; i < cg.length; i++) {
163-
assertTrue(cg[i].isEmpty(), "centroid adjacency must be empty after reset");
161+
List<List<Integer>> cg = cd.getCentroidTree();
162+
for (int i = 0; i < cg.size(); i++) {
163+
assertTrue(cg.get(i).isEmpty(), "centroid adjacency must be empty after reset");
164164
assertEquals(-1, cd.getParent(i), "parent must be -1 after reset");
165165
}
166166

@@ -207,13 +207,13 @@ private static void assertValidCentroidTree(CentroidDecomposition cd, int n) {
207207
int roots = 0;
208208
int edges = 0;
209209

210-
List<Integer>[] cg = cd.getCentroidTree();
210+
List<List<Integer>> cg = cd.getCentroidTree();
211211

212212
for (int v = 0; v < n; v++) {
213213
if (cd.getParent(v) == -1) {
214214
roots++;
215215
}
216-
edges += cg[v].size();
216+
edges += cg.get(v).size();
217217
}
218218

219219
// undirected edges counted twice
@@ -244,25 +244,24 @@ private static void copyEdges(CentroidDecomposition from, CentroidDecomposition
244244
@Test
245245
void testBuildCentroidTree() {
246246
cd.build();
247-
List<Integer>[] centroidTree = cd.getCentroidTree();
248-
List<Integer> correctEight = new ArrayList<Integer>();
249-
List<Integer> correctEleven = new ArrayList<Integer>();
247+
List<List<Integer>> centroidTree = cd.getCentroidTree();
248+
249+
List<Integer> correctEight = new ArrayList<>();
250250
correctEight.add(0);
251251
correctEight.add(3);
252252
correctEight.add(9);
253253
correctEight.add(10);
254254

255+
List<Integer> correctEleven = new ArrayList<>();
255256
correctEleven.add(0);
256257
correctEleven.add(2);
257258
correctEleven.add(12);
258259
correctEleven.add(14);
259260

260-
for (int j = 0; j < centroidTree[8].size(); j++) {
261-
assertEquals(correctEight.get(j), centroidTree[8].get(j));
262-
}
261+
List<Integer> actualEight = centroidTree.get(8);
262+
List<Integer> actualEleven = centroidTree.get(8);
263263

264-
for (int j = 0; j < centroidTree[11].size(); j++) {
265-
assertEquals(correctEleven.get(j), centroidTree[11].get(j));
266-
}
264+
assertEquals(correctEight, actualEight);
265+
assertEquals(correctEleven, actualEleven);
267266
}
268267
}

0 commit comments

Comments
 (0)