C-Sharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript | SQL | PHP | Angular | HTML
Program: In the Program class we have an addWord and an exists() method. These handle strings and manipulate the tree.
AddWord: This loops over all the characters in the String. It calls add() on each letter to add nodes.
charAtExists: This method tests the tree to see if a string exists in it. The result is a boolean.
Java program that implements tree
import java.util.HashMap;
class TreeNode {
boolean word;
HashMap<Character, TreeNode> children = new HashMap<>();
public TreeNode get(char value) {
// Get anode from the HashMap.
return children.getOrDefault(value, null);
}
public TreeNode add(char value, TreeNode node) {
// Add a node if one does not yet exists.
// ... Return the matching node.
children.putIfAbsent(value, node);
return get(value);
}
}
public class Program {
static TreeNode root = new TreeNode();
static void addWord(String value) {
// Add all characters from the string to the tree.
TreeNode node = root;
for (int i = 0; i < value.length(); i++) {
node = node.add(value.charAt(i), node);
}
node.word = true;
}
static boolean exists(String value) {
// See if a word exists in the tree.
TreeNode node = root;
for (int i = 0; i < value.length(); i++) {
node = node.get(value.charAt(i));
if (node == null) {
return false;
}
}
return node.word;
}
public static void main(String[] args) {
// Add three words to the tree.
addWord("cat");
addWord("bird");
addWord("dog");
// These three words should exist.
boolean exists1 = exists("cat");
boolean exists2 = exists("bird");
boolean exists3 = exists("dog");
System.out.println(exists1);
System.out.println(exists2);
System.out.println(exists3);
// These words do not exist.
exists1 = exists("fish");
exists2 = exists("123456");
exists3 = exists("turnip");
System.out.println(exists1);
System.out.println(exists2);
System.out.println(exists3);
}
}
Output
true
true
true
false
false
false
And: The exists() method fortunately returns false on the strings we did not add to the tree.
However: The implementation here is not perfect. The HashMap could be changed to an array of TreeNode references.
And: With an array, we could lazily allocate the array to save memory. We could use a lookup method to match chars to indexes.
Note: For word lists, a tree can share nodes at the ends of words (suffixes). This is not available in this simple program.
And: A custom lookup method, which may be recursive, can encode many restrictions in which nodes to traverse.
Recursion