Skip to content

Commit e9bba9b

Browse files
author
lennart
committed
clean up find Centroid recursion logic
1 parent 95933c2 commit e9bba9b

2 files changed

Lines changed: 28 additions & 26 deletions

File tree

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

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ public int getStartingNode(){
4040
return startingNode;
4141
}
4242

43+
public int[] getSubtreeSizes(){
44+
return subtreeSizes;
45+
}
46+
4347
public List<Integer>[] getCentroidTree(){
4448
return centroidTree;
4549
}
@@ -59,52 +63,50 @@ public int getParent(int v){
5963
return centroidParent[v];
6064
}
6165

62-
public void findSubtreeSizes(int src, boolean[] visited, int[] subtreeSizes){
66+
public void findSubtreeSizes(int src){
6367
// dfs traversal to find size of subtree rooted at src
6468
visited[src] = true;
6569
subtreeSizes[src] = 1;
6670
for (int node : tree[src]){
6771
if(!visited[node] && !centroidMarked[node]){
6872
visited[node] = true;
69-
findSubtreeSizes(node, visited, subtreeSizes); // recurse down to last child node
73+
findSubtreeSizes(node); // recurse down to last child node
7074
subtreeSizes[src] += subtreeSizes[node]; // add size of full recursive path to subtree Size of src
7175
}
7276
}
7377
}
7478

7579
public void findCentroid(int src, int previousCentroid){
76-
// int[] subtreeSizes = new int[N];
77-
// boolean[] visited = new boolean[N];
80+
7881
Arrays.fill(visited, false);
7982

80-
findSubtreeSizes(src, visited, subtreeSizes);
81-
int treeSize = Arrays.stream(subtreeSizes).max().getAsInt();
83+
findSubtreeSizes(src);
84+
int treeSize = subtreeSizes[src];
8285

83-
centroidMarked[src] = true;
86+
int heavyChild = -1;
8487

8588
for (int node : tree[src]){
86-
if (subtreeSizes[node] > (treeSize/2)){
87-
centroidMarked[src] = false;
89+
if(centroidMarked[node]) continue;
90+
if(subtreeSizes[node] > (treeSize/2)){
91+
heavyChild = node;
8892
break;
8993
}
9094
}
91-
92-
if (centroidMarked[src]){
93-
if (src != startingNode && src != previousCentroid) addEdgeCTree(previousCentroid, src);
94-
for (int node : tree[src]){
95-
if (!centroidMarked[node])
96-
findCentroid(node, src);
97-
}
95+
96+
if (heavyChild != -1){
97+
findCentroid(heavyChild, previousCentroid);
98+
return;
9899
}
99-
else{
100-
int nextLargestSubtree = tree[src].getFirst();
101-
for (int node : tree[src]){
102-
if (subtreeSizes[node] >= subtreeSizes[nextLargestSubtree])
103-
nextLargestSubtree = node;
100+
101+
centroidMarked[src] = true;
102+
103+
if(src != startingNode && src != previousCentroid) addEdge(previousCentroid, src);
104+
105+
for (int node : tree[src]){
106+
if (!centroidMarked[node])
107+
findCentroid(node, src);
104108
}
105-
findCentroid(nextLargestSubtree, previousCentroid);
106109
}
107-
}
108110

109111
public static void main(String[] args) {
110112
CentroidDecomposition cd = new CentroidDecomposition(16);

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,10 @@ void setUp(){
6464

6565
@Test
6666
void testFindSubtreeSizes(){
67-
boolean[] visited = new boolean[n];
68-
int[] subtreeSizes = new int[n];
67+
// int[] subtreeSizes = new int[n];
6968

70-
cd.findSubtreeSizes(3, visited, subtreeSizes);
69+
cd.findSubtreeSizes(3);
70+
int[] subtreeSizes = cd.getSubtreeSizes();
7171
assertEquals(subtreeSizes[8], 3);
7272
assertEquals(subtreeSizes[0], 12);
7373
}

0 commit comments

Comments
 (0)