C++版本
class Trie { public: Trie *child[26]; bool isWord; Trie() { isWord = false; for(int i=0;i<26;i++){ child[i] = nullptr; } } /** Inserts a word into the trie. */ void insert(string word) { Trie *cur = this; //this 就像那个不变的根节点root for(int i = 0 ; i < word.size() ; i++) { int num = word[i] - 'a'; if(cur->child[num] == NULL) { cur->child[num] = new Trie(); } cur = cur->child[num]; } cur->isWord = true; } /** Returns if the word is in the trie. */ bool search(string word) { Trie *cur = this; for(int i = 0 ; i < word.size() ; i++) { int num = word[i] - 'a'; if(cur->child[num] == nullptr) { return false; } cur = cur->child[num]; } if(cur->isWord) return true; else return false; } /** Returns if there is any word in the trie that starts with the given prefix. */ bool startsWith(string prefix) { Trie *cur = this; for(int i = 0 ; i < prefix.size() ; i++) { int num = prefix[i] - 'a'; if(cur->child[num] == NULL) { return false; } cur = cur->child[num]; } return true; } }; /** * Your Trie object will be instantiated and called as such: * Trie* obj = new Trie(); * obj->insert(word); * bool param_2 = obj->search(word); * bool param_3 = obj->startsWith(prefix); */
JAVA版本(从大佬的博客粘贴的,下面有链接)
class TrieNode { // 节点 boolean isWord; TrieNode[] children = new TrieNode[26]; } class Trie { TrieNode root; // 根节点 public Trie() { root = new TrieNode(); // 构造字典树,就是先构造出一个空的根节点 } //【向字典树插入单词word】 // 思路:按照word的字符,从根节点开始,一直向下走: // 如果遇到null,就new出新节点;如果节点已经存在,cur顺着往下走就可以 public void insert(String word) { TrieNode cur = root; // 先指向根节点 for (int i = 0; i < word.length(); i++) { // 如果是【后缀树】而不是【前缀树】,把单词倒着插就可以了,即for(len-1; 0; i--) int c = word.charAt(i) - 'a'; // (关键) 将一个字符用数字表示出来,并作为下标 if (cur.children[c] == null) { cur.children[c] = new TrieNode(); } cur = cur.children[c]; } cur.isWord = true; // 一个单词插入完毕,此时cur指向的节点即为一个单词的结尾 } //【判断一个单词word是否完整存在于字典树中】 // 思路:cur从根节点开始,按照word的字符一直尝试向下走: // 如果走到了null,说明这个word不是前缀树的任何一条路径,返回false; // 如果按照word顺利的走完,就要判断此时cur是否为单词尾端:如果是,返回true;如果不是,说明word仅仅是一个前缀,并不完整,返回false public boolean search(String word) { TrieNode cur = root; for (int i = 0; i < word.length(); i++) { int c = word.charAt(i) - 'a'; if (cur.children[c] == null) { return false; } cur = cur.children[c]; } return cur.isWord; } //【判断一个单词word是否是字典树中的前缀】 // 思路:和sesrch方法一样,根据word从根节点开始一直尝试向下走: // 如果遇到null了,说明这个word不是前缀树的任何一条路径,返回false; // 如果安全走完了,直接返回true就行了———我们并不关心此事cur是不是末尾(isWord) public boolean startsWith(String word) { TrieNode cur = root; for (int i = 0; i < word.length(); i++) { int c = word.charAt(i) - 'a'; if (cur.children[c] == null) { return false; } cur = cur.children[c]; } return true; } }
思路参考了一位大佬的博客链接在这里