import java.util.TreeMap; public class Trie { private class Node{ public boolean isWord; public TreeMap<Character, Node> next; public Node(boolean isWord){ this.isWord = isWord; next = new TreeMap<>(); } public Node(){ this(false); } } private Node root; private int size; public Trie(){ root = new Node(); size = 0; } // 获得Trie中存储的单词数量 public int getSize(){ return size; } // 向Trie中添加一个新的单词word public void add(String word){ Node cur = root; for(int i = 0 ; i < word.length() ; i ++){ char c = word.charAt(i); if(cur.next.get(c) == null) cur.next.put(c, new Node()); cur = cur.next.get(c); } if(!cur.isWord){ cur.isWord = true; size ++; } } // 查询单词word是否在Trie中 // 查询和添加的逻辑很相似,区别在于是否创建新节点,在添加方法中,如果孩子节点不存在,则创建新节点,在查询方法中,如果孩子节点不存在,直接返回false告诉调用者查找的单词不存在! public boolean contains(String word){ Node cur = root; for(int i = 0 ; i < word.length() ; i ++){ char c = word.charAt(i); if(cur.next.get(c) == null) return false; cur = cur.next.get(c); } // 注意:这里不能直接返回true,因为一个前缀可能是另一个单词, // 比如:panda这个单词的前三个字母pan刚好是另一个单词, // 例如:Trie中存在panda,不存在pan,假如直接返回true,那么在查询pan这个单词时,也能查到,逻辑就是错误,所以应该返回cur.isWord return cur.isWord; } }