Skip to content

Commit 14946ed

Browse files
author
lennart
committed
add test for getParent method, make build/reset method
1 parent e9bba9b commit 14946ed

2 files changed

Lines changed: 98 additions & 58 deletions

File tree

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

Lines changed: 49 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
import java.util.ArrayList;
44
import java.util.Arrays;
55
import java.util.List;
6+
import java.util.stream.Collector;
7+
import java.util.stream.Collectors;
68

79
public class CentroidDecomposition {
8-
private List<Integer>[] tree;
9-
private List<Integer>[] centroidTree;
10+
private ArrayList<Integer>[] tree;
11+
private ArrayList<Integer>[] centroidTree;
1012
private int[] subtreeSizes;
1113
private boolean[] visited;
1214
private boolean[] centroidMarked;
@@ -27,6 +29,7 @@ public CentroidDecomposition(int n, int startingNode){
2729
throw new IllegalArgumentException("Starting node must be in range 0.." + (n - 1) + " but got " + startingNode);
2830
}
2931
for(int i = 0; i<n; i++){
32+
centroidParent[i] = -1;
3033
tree[i] = new ArrayList<>();
3134
centroidTree[i] = new ArrayList<>();
3235
}
@@ -36,6 +39,20 @@ public CentroidDecomposition(int n){
3639
this(n, (int)(Math.random() * n));
3740
}
3841

42+
public void build(){
43+
findCentroid(startingNode, startingNode);
44+
}
45+
46+
public void reset(){
47+
for(int i = 0; i<N; i++){
48+
centroidTree[i] = new ArrayList<>();
49+
centroidParent[i] = -1;
50+
subtreeSizes[i] = 0;
51+
centroidMarked[i] = false;
52+
visited[i] = false;
53+
}
54+
}
55+
3956
public int getStartingNode(){
4057
return startingNode;
4158
}
@@ -44,11 +61,7 @@ public int[] getSubtreeSizes(){
4461
return subtreeSizes;
4562
}
4663

47-
public List<Integer>[] getCentroidTree(){
48-
return centroidTree;
49-
}
50-
51-
public void addEdge(int u, int v){
64+
public void addEdgeTree(int u, int v){
5265
tree[u].add(v);
5366
tree[v].add(u);
5467
}
@@ -59,19 +72,22 @@ private void addEdgeCTree(int u, int v){
5972
centroidParent[v] = u;
6073
}
6174

75+
public ArrayList<Integer>[] getCentroidTree(){
76+
return centroidTree;
77+
}
78+
6279
public int getParent(int v){
6380
return centroidParent[v];
6481
}
6582

6683
public void findSubtreeSizes(int src){
67-
// dfs traversal to find size of subtree rooted at src
6884
visited[src] = true;
6985
subtreeSizes[src] = 1;
7086
for (int node : tree[src]){
7187
if(!visited[node] && !centroidMarked[node]){
7288
visited[node] = true;
73-
findSubtreeSizes(node); // recurse down to last child node
74-
subtreeSizes[src] += subtreeSizes[node]; // add size of full recursive path to subtree Size of src
89+
findSubtreeSizes(node);
90+
subtreeSizes[src] += subtreeSizes[node];
7591
}
7692
}
7793
}
@@ -100,7 +116,7 @@ public void findCentroid(int src, int previousCentroid){
100116

101117
centroidMarked[src] = true;
102118

103-
if(src != startingNode && src != previousCentroid) addEdge(previousCentroid, src);
119+
if(src != startingNode && src != previousCentroid) addEdgeCTree(previousCentroid, src);
104120

105121
for (int node : tree[src]){
106122
if (!centroidMarked[node])
@@ -110,30 +126,30 @@ public void findCentroid(int src, int previousCentroid){
110126

111127
public static void main(String[] args) {
112128
CentroidDecomposition cd = new CentroidDecomposition(16);
113-
cd.addEdge(0, 1);
114-
cd.addEdge(0, 2);
115-
cd.addEdge(0, 3);
116-
cd.addEdge(1, 4);
117-
cd.addEdge(1, 5);
118-
cd.addEdge(2, 6);
119-
cd.addEdge(2, 7);
120-
cd.addEdge(3, 8);
121-
cd.addEdge(8, 9);
122-
cd.addEdge(8, 10);
123-
cd.addEdge(6, 11);
124-
cd.addEdge(11, 12);
125-
cd.addEdge(11, 13);
126-
cd.addEdge(13, 14);
127-
cd.addEdge(14, 15);
128-
129-
boolean[] visited = new boolean[16];
130-
int[] subtreeSizes = new int[16];
129+
cd.addEdgeTree(0, 1);
130+
cd.addEdgeTree(0, 2);
131+
cd.addEdgeTree(0, 3);
132+
cd.addEdgeTree(1, 4);
133+
cd.addEdgeTree(1, 5);
134+
cd.addEdgeTree(2, 6);
135+
cd.addEdgeTree(2, 7);
136+
cd.addEdgeTree(3, 8);
137+
cd.addEdgeTree(8, 9);
138+
cd.addEdgeTree(8, 10);
139+
cd.addEdgeTree(6, 11);
140+
cd.addEdgeTree(11, 12);
141+
cd.addEdgeTree(11, 13);
142+
cd.addEdgeTree(13, 14);
143+
cd.addEdgeTree(14, 15);
144+
145+
// boolean[] visited = new boolean[16];
146+
// int[] subtreeSizes = new int[16];
131147

132148
// int start = cd.startingNode;
133-
int src = (int)(Math.random() * 15);
134-
System.out.println("src= " + src);
135-
136-
cd.findCentroid(src, src);
149+
// int src = (int)(Math.random() * 15);
150+
// System.out.println("src= " + src);
151+
int start = cd.getStartingNode();
152+
cd.findCentroid(start, start);
137153

138154
// System.out.println((int)(Math.random() * 16));
139155

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

Lines changed: 49 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -12,26 +12,26 @@
1212

1313
class CentroidDecompositionTest {
1414
private CentroidDecomposition cd;
15-
private int n = 16;
1615

1716
@BeforeEach
1817
void setUp(){
1918
cd = new CentroidDecomposition(16);
20-
cd.addEdge(0, 1);
21-
cd.addEdge(0, 2);
22-
cd.addEdge(0, 3);
23-
cd.addEdge(1, 4);
24-
cd.addEdge(1, 5);
25-
cd.addEdge(2, 6);
26-
cd.addEdge(2, 7);
27-
cd.addEdge(3, 8);
28-
cd.addEdge(8, 9);
29-
cd.addEdge(8, 10);
30-
cd.addEdge(6, 11);
31-
cd.addEdge(11, 12);
32-
cd.addEdge(11, 13);
33-
cd.addEdge(13, 14);
34-
cd.addEdge(14, 15);
19+
cd.addEdgeTree(0, 1);
20+
cd.addEdgeTree(0, 2);
21+
cd.addEdgeTree(0, 3);
22+
cd.addEdgeTree(1, 4);
23+
cd.addEdgeTree(1, 5);
24+
cd.addEdgeTree(2, 6);
25+
cd.addEdgeTree(2, 7);
26+
cd.addEdgeTree(3, 8);
27+
cd.addEdgeTree(8, 9);
28+
cd.addEdgeTree(8, 10);
29+
cd.addEdgeTree(6, 11);
30+
cd.addEdgeTree(11, 12);
31+
cd.addEdgeTree(11, 13);
32+
cd.addEdgeTree(13, 14);
33+
cd.addEdgeTree(14, 15);
34+
3535

3636
/*
3737
* Initial Tree:
@@ -79,19 +79,43 @@ void IllegalArgumentThrows(){
7979
});
8080
}
8181

82+
@Test
83+
void testGetParent(){
84+
cd.build();
85+
int three = 8;
86+
int Twelve = 11;
87+
int Five = 1;
88+
int Eleven = 0;
89+
90+
assertEquals(cd.getParent(3), three);
91+
assertEquals(cd.getParent(12), Twelve);
92+
assertEquals(cd.getParent(5), Five);
93+
assertEquals(cd.getParent(11), Eleven);
94+
95+
}
96+
8297
@RepeatedTest(100)
8398
void testBuildCentroidTree(){
84-
int start = cd.getStartingNode();
85-
System.out.println(start);
86-
List<Integer>[] centroidTree = cd.getCentroidTree();
87-
List<Integer> correct = new ArrayList<Integer>();
88-
correct.add(0);
89-
correct.add(3);
90-
correct.add(9);
91-
correct.add(10);
99+
cd.build();
100+
ArrayList<Integer>[] centroidTree = cd.getCentroidTree();
101+
ArrayList<Integer> correctEight = new ArrayList<Integer>();
102+
ArrayList<Integer> correctEleven = new ArrayList<Integer>();
103+
correctEight.add(0);
104+
correctEight.add(3);
105+
correctEight.add(9);
106+
correctEight.add(10);
107+
108+
correctEleven.add(0);
109+
correctEleven.add(2);
110+
correctEleven.add(12);
111+
correctEleven.add(14);
112+
113+
for (int j = 0; j < centroidTree[8].size(); j++) {
114+
assertEquals(correctEight.get(j), centroidTree[8].get(j));
115+
}
92116

93117
for (int j = 0; j < centroidTree[8].size(); j++) {
94-
assertEquals(correct.get(j), centroidTree[8].get(j));
118+
assertEquals(correctEleven.get(j), centroidTree[11].get(j));
95119
}
96120

97121
}

0 commit comments

Comments
 (0)