Skip to content

Commit 03c80a3

Browse files
committed
Tree Isomorphism tests and slides
1 parent d4877f5 commit 03c80a3

File tree

3 files changed

+137
-4
lines changed

3 files changed

+137
-4
lines changed

com/williamfiset/algorithms/graphtheory/treealgorithms/TreeIsomorphism.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import java.util.*;
1414

1515
public class TreeIsomorphism {
16+
1617
public static class TreeNode {
1718
private int id;
1819
private TreeNode parent;
@@ -103,6 +104,10 @@ private static List<Integer> findTreeCenters(List<List<Integer>> tree) {
103104

104105
// Determines if two unrooted trees are isomorphic
105106
public static boolean treesAreIsomorphic(List<List<Integer>> tree1, List<List<Integer>> tree2) {
107+
if (tree1.isEmpty() || tree2.isEmpty()) {
108+
throw new IllegalArgumentException("Empty tree input");
109+
}
110+
106111
List<Integer> centers1 = findTreeCenters(tree1);
107112
List<Integer> centers2 = findTreeCenters(tree2);
108113

@@ -121,7 +126,7 @@ private static boolean areIsomorphic(TreeNode root1, TreeNode root2) {
121126

122127
// Constructs the canonical form representation of a tree as a string.
123128
private static String encode(TreeNode node) {
124-
if (node == null || node.isLeaf()) {
129+
if (node == null) {
125130
return "()";
126131
}
127132
List<String> labels = new LinkedList<>();
@@ -137,13 +142,13 @@ private static String encode(TreeNode node) {
137142
}
138143

139144
// Create a graph as a adjacency list
140-
private static List<List<Integer>> createGraph(int n) {
145+
public static List<List<Integer>> createGraph(int n) {
141146
List<List<Integer>> graph = new ArrayList<>(n);
142147
for (int i = 0; i < n; i++) graph.add(new LinkedList<>());
143148
return graph;
144149
}
145150

146-
private static void addUndirectedEdge(List<List<Integer>> graph, int from, int to) {
151+
public static void addUndirectedEdge(List<List<Integer>> graph, int from, int to) {
147152
graph.get(from).add(to);
148153
graph.get(to).add(from);
149154
}
@@ -170,5 +175,4 @@ public static void main(String[] args) {
170175
System.out.println("Oops something is not right.");
171176
}
172177
}
173-
174178
}
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
// To run this test in isolation from root folder:
2+
//
3+
// $ gradle test --tests javatests.com.williamfiset.algorithms.graphtheory.treealgorithms.TreeIsomorphismTest
4+
5+
package javatests.com.williamfiset.algorithms.graphtheory.treealgorithms;
6+
7+
import static com.google.common.truth.Truth.assertThat;
8+
9+
import static com.williamfiset.algorithms.graphtheory.treealgorithms.TreeIsomorphism.addUndirectedEdge;
10+
import static com.williamfiset.algorithms.graphtheory.treealgorithms.TreeIsomorphism.createGraph;
11+
import static com.williamfiset.algorithms.graphtheory.treealgorithms.TreeIsomorphism.treesAreIsomorphic;
12+
13+
import java.util.*;
14+
import org.junit.*;
15+
16+
public class TreeIsomorphismTest {
17+
18+
@Test(expected = IllegalArgumentException.class)
19+
public void emptyTreeThrowsException() {
20+
treesAreIsomorphic(createGraph(0), createGraph(1));
21+
}
22+
23+
@Test
24+
public void singletonTreesAreIsomorphic() {
25+
assertThat(treesAreIsomorphic(createGraph(1), createGraph(1))).isEqualTo(true);
26+
}
27+
28+
@Test
29+
public void testTwoNodeTree() {
30+
List<List<Integer>> tree1 = createGraph(2);
31+
List<List<Integer>> tree2 = createGraph(2);
32+
addUndirectedEdge(tree1, 0, 1);
33+
addUndirectedEdge(tree2, 1, 0);
34+
assertThat(treesAreIsomorphic(tree1, tree2)).isEqualTo(true);
35+
}
36+
37+
@Test
38+
public void testSmall() {
39+
List<List<Integer>> tree1 = createGraph(5);
40+
List<List<Integer>> tree2 = createGraph(5);
41+
42+
addUndirectedEdge(tree1, 2, 0);
43+
addUndirectedEdge(tree1, 2, 1);
44+
addUndirectedEdge(tree1, 2, 3);
45+
addUndirectedEdge(tree1, 3, 4);
46+
47+
addUndirectedEdge(tree2, 1, 3);
48+
addUndirectedEdge(tree2, 1, 0);
49+
addUndirectedEdge(tree2, 1, 2);
50+
addUndirectedEdge(tree2, 2, 4);
51+
52+
assertThat(treesAreIsomorphic(tree1, tree2)).isEqualTo(true);
53+
}
54+
55+
@Test
56+
public void testSimilarChains() {
57+
// Trees 1 and 3 are equal
58+
int n = 10;
59+
List<List<Integer>> tree1 = createGraph(n);
60+
List<List<Integer>> tree2 = createGraph(n);
61+
List<List<Integer>> tree3 = createGraph(n);
62+
63+
addUndirectedEdge(tree1, 0, 1);
64+
addUndirectedEdge(tree1, 1, 3);
65+
addUndirectedEdge(tree1, 3, 5);
66+
addUndirectedEdge(tree1, 5, 7);
67+
addUndirectedEdge(tree1, 7, 8);
68+
addUndirectedEdge(tree1, 8, 9);
69+
addUndirectedEdge(tree1, 2, 1);
70+
addUndirectedEdge(tree1, 4, 3);
71+
addUndirectedEdge(tree1, 6, 5);
72+
73+
addUndirectedEdge(tree2, 0, 1);
74+
addUndirectedEdge(tree2, 1, 3);
75+
addUndirectedEdge(tree2, 3, 5);
76+
addUndirectedEdge(tree2, 5, 6);
77+
addUndirectedEdge(tree2, 6, 8);
78+
addUndirectedEdge(tree2, 8, 9);
79+
addUndirectedEdge(tree2, 6, 7);
80+
addUndirectedEdge(tree2, 4, 3);
81+
addUndirectedEdge(tree2, 2, 1);
82+
83+
addUndirectedEdge(tree3, 0, 1);
84+
addUndirectedEdge(tree3, 1, 8);
85+
addUndirectedEdge(tree3, 1, 6);
86+
addUndirectedEdge(tree3, 6, 4);
87+
addUndirectedEdge(tree3, 6, 5);
88+
addUndirectedEdge(tree3, 5, 3);
89+
addUndirectedEdge(tree3, 5, 7);
90+
addUndirectedEdge(tree3, 7, 2);
91+
addUndirectedEdge(tree3, 2, 9);
92+
93+
assertThat(treesAreIsomorphic(tree1, tree2)).isEqualTo(false);
94+
assertThat(treesAreIsomorphic(tree1, tree3)).isEqualTo(true);
95+
assertThat(treesAreIsomorphic(tree2, tree3)).isEqualTo(false);
96+
}
97+
98+
@Test
99+
public void simpleTest() {
100+
List<List<Integer>> tree1 = createGraph(5);
101+
List<List<Integer>> tree2 = createGraph(5);
102+
103+
addUndirectedEdge(tree1, 2, 0);
104+
addUndirectedEdge(tree1, 3, 4);
105+
addUndirectedEdge(tree1, 2, 1);
106+
addUndirectedEdge(tree1, 2, 3);
107+
108+
addUndirectedEdge(tree2, 1, 0);
109+
addUndirectedEdge(tree2, 2, 4);
110+
addUndirectedEdge(tree2, 1, 3);
111+
addUndirectedEdge(tree2, 1, 2);
112+
113+
assertThat(treesAreIsomorphic(tree1, tree2)).isEqualTo(true);
114+
}
115+
116+
@Test
117+
public void differentNumberOfNodes() {
118+
List<List<Integer>> tree1 = createGraph(2);
119+
List<List<Integer>> tree2 = createGraph(3);
120+
121+
addUndirectedEdge(tree1, 0, 1);
122+
123+
addUndirectedEdge(tree2, 0, 1);
124+
addUndirectedEdge(tree2, 1, 2);
125+
126+
assertThat(treesAreIsomorphic(tree1, tree2)).isEqualTo(false);
127+
}
128+
129+
}

slides/graphtheory/trees_slides.key

32.4 KB
Binary file not shown.

0 commit comments

Comments
 (0)