Skip to content

Commit c454fc8

Browse files
committed
Merge branch 'BAEL-1434' of git://github.com/fatosmorina/tutorials into fatosmorina-BAEL-1434
2 parents 7e7ccc7 + 39af5c7 commit c454fc8

3 files changed

Lines changed: 164 additions & 0 deletions

File tree

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package com.baeldung.trie;
2+
3+
public class Trie {
4+
private TrieNode root;
5+
6+
public Trie() {
7+
root = new TrieNode();
8+
}
9+
10+
public void insert(String word) {
11+
TrieNode current = root;
12+
for (int i = 0; i < word.length(); i++) {
13+
char ch = word.charAt(i);
14+
TrieNode node = current.getChildren()
15+
.get(ch);
16+
if (node == null) {
17+
node = new TrieNode();
18+
current.getChildren()
19+
.put(ch, node);
20+
}
21+
current = node;
22+
}
23+
current.setEndOfWord(true);
24+
}
25+
26+
public boolean find(String word) {
27+
TrieNode current = root;
28+
for (int i = 0; i < word.length(); i++) {
29+
char ch = word.charAt(i);
30+
TrieNode node = current.getChildren()
31+
.get(ch);
32+
if (node == null) {
33+
return false;
34+
}
35+
current = node;
36+
}
37+
return current.isEndOfWord();
38+
}
39+
40+
public void delete(String word) {
41+
delete(root, word, 0);
42+
}
43+
44+
private boolean delete(TrieNode current, String word, int index) {
45+
if (index == word.length()) {
46+
if (!current.isEndOfWord()) {
47+
return false;
48+
}
49+
current.setEndOfWord(false);
50+
return current.getChildren()
51+
.size() == 0;
52+
}
53+
char ch = word.charAt(index);
54+
TrieNode node = current.getChildren()
55+
.get(ch);
56+
if (node == null) {
57+
return false;
58+
}
59+
boolean shouldDeleteCurrentNode = delete(node, word, index + 1);
60+
61+
if (shouldDeleteCurrentNode) {
62+
current.getChildren()
63+
.remove(ch);
64+
return current.getChildren()
65+
.size() == 0;
66+
}
67+
return false;
68+
}
69+
70+
public boolean containsNode(String word) {
71+
return find(word);
72+
}
73+
74+
public boolean isEmpty() {
75+
return root == null;
76+
}
77+
78+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.baeldung.trie;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
class TrieNode {
7+
private Map<Character, TrieNode> children;
8+
private boolean endOfWord;
9+
10+
public TrieNode() {
11+
children = new HashMap<>();
12+
endOfWord = false;
13+
}
14+
15+
public Map<Character, TrieNode> getChildren() {
16+
return children;
17+
}
18+
19+
public void setChildren(Map<Character, TrieNode> children) {
20+
this.children = children;
21+
}
22+
23+
public boolean isEndOfWord() {
24+
return endOfWord;
25+
}
26+
27+
public void setEndOfWord(boolean endOfWord) {
28+
this.endOfWord = endOfWord;
29+
}
30+
31+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.baeldung.trie;
2+
3+
import static org.junit.Assert.assertFalse;
4+
import static org.junit.Assert.assertTrue;
5+
6+
import org.junit.Test;
7+
8+
public class TrieTest {
9+
@Test
10+
public void givenATrie_WhenAddingElements_ThenTrieNotEmpty() {
11+
Trie trie = createTrie();
12+
13+
assertFalse(trie.isEmpty());
14+
}
15+
16+
@Test
17+
public void givenATrie_WhenAddingElements_ThenTrieHasThoseElements() {
18+
Trie trie = createTrie();
19+
20+
assertFalse(trie.containsNode("3"));
21+
assertFalse(trie.containsNode("vida"));
22+
23+
assertTrue(trie.containsNode("life"));
24+
}
25+
26+
@Test
27+
public void givenATrie_WhenLookingForNonExistingElement_ThenReturnsFalse() {
28+
Trie trie = createTrie();
29+
30+
assertFalse(trie.containsNode("99"));
31+
}
32+
33+
@Test
34+
public void givenATrie_WhenDeletingElements_ThenTreeDoesNotContainThoseElements() {
35+
36+
Trie trie = createTrie();
37+
38+
assertTrue(trie.containsNode("Programming"));
39+
trie.delete("Programming");
40+
assertFalse(trie.containsNode("Programming"));
41+
}
42+
43+
private Trie createTrie() {
44+
Trie trie = new Trie();
45+
46+
trie.insert("Programming");
47+
trie.insert("is");
48+
trie.insert("a");
49+
trie.insert("way");
50+
trie.insert("of");
51+
trie.insert("life");
52+
53+
return trie;
54+
}
55+
}

0 commit comments

Comments
 (0)