Skip to content

Commit 563ef68

Browse files
author
lennart
committed
make base structure, make method for finding sizes of subtrees
1 parent 5a68ba9 commit 563ef68

2 files changed

Lines changed: 151 additions & 0 deletions

File tree

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package com.thealgorithms.tree;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.List;
6+
import java.util.HashMap;
7+
8+
public class CentroidDecomposition {
9+
private List<Integer>[] tree;
10+
private List<Integer>[] centroidTree;
11+
private boolean[] removedCentroids;
12+
13+
public CentroidDecomposition(int n){
14+
tree = new ArrayList[n];
15+
centroidTree = new ArrayList[n];
16+
removedCentroids = new boolean[n];
17+
for(int i = 0; i<n; i++){
18+
tree[i] = new ArrayList<>();
19+
}
20+
}
21+
22+
public void addEdge(int u, int v){
23+
tree[u].add(v);
24+
tree[v].add(u);
25+
}
26+
27+
public void findSubtreeSizes(int src, boolean[] visited, int[] subtreeSizes){
28+
// dfs traversal to find size of subtree rooted at src
29+
visited[src] = true;
30+
subtreeSizes[src] = 1;
31+
for (int node : tree[src]){
32+
if(!visited[node]){
33+
visited[node] = true;
34+
findSubtreeSizes(node, visited, subtreeSizes); // recurse down to last child node
35+
subtreeSizes[src] += subtreeSizes[node]; // add size of full recursive path to subtree Size of src
36+
}
37+
}
38+
}
39+
40+
private void findCentroid(int src){
41+
int treeSize = tree[src].size();
42+
int[] subtreeSizes = new int[treeSize];
43+
boolean[] visited = new boolean[treeSize];
44+
Arrays.fill(visited, false);
45+
46+
findSubtreeSizes(src, visited, subtreeSizes);
47+
48+
boolean isCentroid = true;
49+
for (int node : tree[src]){
50+
isCentroid = (subtreeSizes[node] <= (subtreeSizes[src]/2)) ? true : false;
51+
}
52+
53+
if (isCentroid){
54+
for (int node : tree[src]){
55+
56+
}
57+
}
58+
else{
59+
// pick one of the children of the node for next check
60+
}
61+
}
62+
63+
public static void main(String[] args) {
64+
CentroidDecomposition cd = new CentroidDecomposition(16);
65+
cd.addEdge(0, 1);
66+
cd.addEdge(0, 2);
67+
cd.addEdge(0, 3);
68+
cd.addEdge(1, 4);
69+
cd.addEdge(1, 5);
70+
cd.addEdge(2, 6);
71+
cd.addEdge(2, 7);
72+
cd.addEdge(3, 8);
73+
cd.addEdge(8, 9);
74+
cd.addEdge(8, 10);
75+
cd.addEdge(6, 11);
76+
cd.addEdge(11, 12);
77+
cd.addEdge(11, 13);
78+
cd.addEdge(13, 14);
79+
cd.addEdge(14, 15);
80+
81+
boolean[] visited = new boolean[16];
82+
int[] subtreeSizes = new int[16];
83+
84+
cd.findSubtreeSizes(3, visited, subtreeSizes);
85+
}
86+
87+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.thealgorithms.tree;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertTrue;
5+
import static org.mockito.Answers.values;
6+
7+
import java.util.Arrays;
8+
9+
import org.junit.jupiter.api.BeforeEach;
10+
import org.junit.jupiter.api.Test;
11+
12+
class CentroidDecompositionTest {
13+
private CentroidDecomposition cd;
14+
15+
@BeforeEach
16+
void setUp(){
17+
cd = new CentroidDecomposition(16);
18+
cd.addEdge(0, 1);
19+
cd.addEdge(0, 2);
20+
cd.addEdge(0, 3);
21+
cd.addEdge(1, 4);
22+
cd.addEdge(1, 5);
23+
cd.addEdge(2, 6);
24+
cd.addEdge(2, 7);
25+
cd.addEdge(3, 8);
26+
cd.addEdge(8, 9);
27+
cd.addEdge(8, 10);
28+
cd.addEdge(6, 11);
29+
cd.addEdge(11, 12);
30+
cd.addEdge(11, 13);
31+
cd.addEdge(13, 14);
32+
cd.addEdge(14, 15);
33+
34+
/*
35+
* 0
36+
/ | \
37+
1 2 3
38+
/ \ / \ \
39+
4 5 6 7 8
40+
| / \
41+
11 9 10
42+
/ \
43+
12 13
44+
\
45+
14
46+
\
47+
15
48+
49+
*/
50+
}
51+
52+
@Test
53+
void testFindSubtreeSizes(){
54+
boolean[] visited = new boolean[16];
55+
int[] subtreeSizes = new int[16];
56+
57+
cd.findSubtreeSizes(3, visited, subtreeSizes);
58+
assertEquals(subtreeSizes[8], 3);
59+
assertEquals(subtreeSizes[0], 12);
60+
}
61+
62+
63+
64+
}

0 commit comments

Comments
 (0)