问题描述:
实现前缀树的插入,查找和部分前缀的查找
代码如下:
Trie节点定义如下:
public class Trie {
//前缀树节点
boolean isEnd;//判断是否为末尾元素
Trie[] children;//当前节点的孩子节点
public Trie() {
this.isEnd=false;//默认末尾标志为false
children=new Trie[26];//只针对小写字母
}
}
前缀树具体实现如下:
import java.util.LinkedList;
import java.util.List;
//前缀树实现
public class MyTrie {
public Trie root;
public MyTrie(Trie root) {
this.root = root;
}
//插入字符串
public void insert(String word){
Trie p=root;
for (int i = 0; i <word.length() ; i++) {
int temp=word.charAt(i)-'a';//记录该字符应该是在哪一个数组下标中
if (p.children[temp]==null){
p.children[temp]=new Trie();
}
p=p.children[temp];
}
p.isEnd=true;//将该单词的最后一个标志位置为true
}
//查找字符串
//查找字符串,若字符串的任意字符所对应的节点为空,那么返回false
//若字符串最后一个字符所对应的节点并非结尾,返回false
//其他情况返回true
public boolean search(String word){
Trie p=root;
for (int i = 0; i <word.length() ; i++) {
int temp=word.charAt(i)-'a';
if (p.children[temp]==null) return false;
else {
p=p.children[temp];
}
}
if (!p.isEnd) return false;
return true;
}
//查找字符前缀,若前缀中的任意字符所对应的节点为空,那么返回false
//其他情况返回True
public boolean startWith(String prefix){
Trie p=root;
for (int i = 0; i <prefix.length() ; i++) {
int temp=prefix.charAt(i)-'a';
if (p.children[temp]==null) return false;
p=p.children[temp];
}
return true;
}
}
测试用例如下:
public class TireTest {
//前缀树测试类
public static void main(String[] args) {
Trie root=new Trie();
MyTrie myTrie=new MyTrie(root);
myTrie.insert("hello");
myTrie.insert("world");
myTrie.insert("him");
System.out.println(myTrie.search("aa"));
System.out.println(myTrie.search("hello"));
System.out.println(myTrie.search("world"));
System.out.println(myTrie.startWith("hi"));
}
}
测试结果如下: