Trie树的java代码 实现如下:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;/***//**
* A word trie which can only deal with 26 alphabeta letters.
* @author Leeclipse
* @since 2007-11-21*/
public classTrie{private Vertex root;//一个Trie树有一个根节点//内部类
protected class Vertex{//节点类
protected intwords;protected intprefixes;protected Vertex[] edges;//每个节点包含26个子节点(类型为自身)
Vertex() {
words= 0;
prefixes= 0;
edges= new Vertex[26];for (int i = 0; i < edges.length; i++) {
edges[i]= null;
}
}
}publicTrie () {
root= newVertex();
}/***//**
* List all words in the Trie.
*
* @return*/
public List< String>listAllWords() {
List< String> words = new ArrayList< String>();
Vertex[] edges=root.edges;for (int i = 0; i < edges.length; i++) {if (edges[i] != null) {
String word= "" + (char)('a' +i);
depthFirstSearchWords(words, edges[i], word);
}
}returnwords;
}/***//**
* Depth First Search words in the Trie and add them to the List.
*
* @param words
* @param vertex
* @param wordSegment*/
private voiddepthFirstSearchWords(List words, Vertex vertex, String wordSegment) {
Vertex[] edges=vertex.edges;
boolean hasChildren= false;for (int i = 0; i < edges.length; i++) {if (edges[i] != null) {
hasChildren= true;
String newWord= wordSegment + (char)('a' +i);
depthFirstSearchWords(words, edges[i], newWord);
}
}if (!hasChildren) {
words.add(wordSegment);
}
}public intcountPrefixes(String prefix) {returncountPrefixes(root, prefix);
}private intcountPrefixes(Vertex vertex, String prefixSegment) {if (prefixSegment.length() == 0) { //reach the last character of the word
returnvertex.prefixes;
}char c = prefixSegment.charAt(0);int index = c - 'a';if (vertex.edges[index] == null) { //the word does NOT exist
return 0;
}else{return countPrefixes(vertex.edges[index], prefixSegment.substring(1));
}
}public intcountWords(String word) {returncountWords(root, word);
}private intcountWords(Vertex vertex, String wordSegment) {if (wordSegment.length() == 0) { //reach the last character of the word
returnvertex.words;
}char c = wordSegment.charAt(0);int index = c - 'a';if (vertex.edges[index] == null) { //the word does NOT exist
return 0;
}else{return countWords(vertex.edges[index], wordSegment.substring(1));
}
}/***//**
* Add a word to the Trie.
*
* @param word The word to be added.*/
public voidaddWord(String word) {
addWord(root, word);
}/***//**
* Add the word from the specified vertex.
* @param vertex The specified vertex.
* @param word The word to be added.*/
private voidaddWord(Vertex vertex, String word) {if (word.length() == 0) { //if all characters of the word has been added
vertex.words ++;
}else{
vertex.prefixes++;char c = word.charAt(0);
c=Character.toLowerCase(c);int index = c - 'a';if (vertex.edges[index] == null) { //if the edge does NOT exist
vertex.edges[index] = newVertex();
}
addWord(vertex.edges[index], word.substring(1)); //go the the next character
}
}public static void main(String args[]) //Just used for test
{
Trie trie= newTrie();
trie.addWord("China");
trie.addWord("China");
trie.addWord("China");
trie.addWord("crawl");
trie.addWord("crime");
trie.addWord("ban");
trie.addWord("China");
trie.addWord("english");
trie.addWord("establish");
trie.addWord("eat");
System.out.println(trie.root.prefixes);
System.out.println(trie.root.words);
List< String> list =trie.listAllWords();
Iterator listiterator=list.listIterator();while(listiterator.hasNext())
{
String s=(String)listiterator.next();
System.out.println(s);
}int count = trie.countPrefixes("ch");int count1=trie.countWords("china");
System.out.println("the count of c prefixes:"+count);
System.out.println("the count of china countWords:"+count1);
}
}
运行:
C:\test>java Trie10
0ban
china
crawl
crime
eat
english
establish
the count of c prefixes:4the count of china countWords:4