字典树经常用于单词搜索,现在网络引擎中也应用了trie树;

public class Trie{
private int SIZE = 26;
private TrieNode root;
Trie(){
root = new TrieNode();
}
private class TrieNode{
private int num;//the times that words passing this node
private TrieNode[] son;//son point
private boolean isEnd;//record weather there are points ending in this point
private char val;//char value
public TrieNode(){
num = 1;
son = new TrieNode[SIZE];
isEnd = false;
}
}
//create the trie tree
public void insert(String str){//insert a word to the trie tree
if(str == null||str.length() == 0){
return;
}
TrieNode node = root;
char[] letters = str.toCharArray();
for(int i =0,len = str.length();i<len;i++){
int pos = letters[i]-'a';
if(node.son[pos]==null){
node.son[pos] = new TrieNode();
node.son[pos].val = letters[i];
}else{
node.son[pos].num++;
}
node = node.son[pos];
}
node.isEnd= true;//
}
//calculate the count of words'prefix
public int countPrefix(String prefix){
if(prefix == null||prefix.length()==0){
return -1;
}
TrieNode node = root;
char[] letters = prefix.toCharArray();
int pos;
int num = 0;
for(int i=0,len = prefix.length();i<len;i++){
pos = letters[i]-'a';
node = node.son[pos];
if(node==null){
return 0;
}else{
num = node.num;
}
}
return num;
}
//print the word having the assigned prefix
public String hasprefix(String prefix){
if(prefix ==null||prefix.length()==0){
return null;
}
TrieNode node = root;
char[] letters = prefix.toCharArray();
int pos;
for(int i=0,len = prefix.length();i<len; i++){
pos = letters[i]-'a';
if(node.son[pos]==null){
return null;
}else{
node = node.son[pos];
}
}
preTraverse(node,prefix);
return null;
}
//walk the node's words
public void preTraverse(TrieNode node,String prefix){
if(!node.isEnd){
for(TrieNode child:node.son){
if(child!=null){
preTraverse(child,prefix+child.val);
}
}
return;
}
System.out.println(prefix);
}
//find the completely matching word
public boolean has(String str){
if(str == null||str.length() == 0){
return false;
}
TrieNode node = root;
char[] letters = str.toCharArray();
int pos;
for(int i=0,len = str.length();i<len;i++){
pos = letters[i]-'a';
if(node.son[pos]==null){
return false;
}else{
node = node.son[pos];
}
}
return node.isEnd;
}
//pre-order of the trie tree
public void preTraverse(TrieNode node){
if(node!=null){
System.out.print(node.val+" ");
for(TrieNode child:node.son){
preTraverse(child);
}
}
}
public TrieNode getRoot(){
return this.root;
}
public static void main(String[] args){
Trie tree = new Trie();
String[] strs = {"dsfahjk","fjdkafhdask","fdhjfk","dafjdk","qepoi","fda"};
String[] prefix={"ds","f","qepo","abd"};
for(String str:strs){
tree.insert(str);
}
for(String pre:prefix){
int num = tree.countPrefix(pre);
System.out.println(pre+" "+num);
}
tree.preTraverse(tree.getRoot());
System.out.println("\ntree.has(\"f\"):"+tree.has("f"));
System.out.println("tree.has(\"fda\"):"+tree.has("fda"));
tree.hasprefix("f");
System.out.println("countprefix(\"f\"):"+tree.countPrefix("f"));
}
}

最新文章

  1. js实现无限极分类
  2. LESS用法&#183;
  3. CCF真题之ISBN号码
  4. bootstrap部分---网格系统;(几天没写博客了,为了潜心研究一下bootstrap)
  5. 最新hosts,更新hosts,可用
  6. 生成静态页面的PHP类
  7. SQL 使用Cursor(游标)遍历结果集
  8. Spring 入门 AOP
  9. 页面loading提示效果
  10. Android 主题theme说明 摘记
  11. 获取对象属性(key)组成的数组 Object.keys( obj ).md
  12. 集群增量会话管理器——DeltaManager
  13. 基于角色的访问控制 (RBAC)权限管理
  14. s6-4 TCP 数据段
  15. 浅谈tidb事务与MySQL事务之间的区别
  16. Hadoop---集群的搭建(仅主机模式)
  17. Js或 Activex 控件调用打印预览等操作
  18. verilog语法实例学习(10)
  19. js实现放大缩小页面
  20. ListView点击Item展开隐藏项(单项展开、多项展开、复杂布局时的展开处理)

热门文章

  1. IO (一)
  2. c# 基础任务1
  3. js按位运算符及其妙用
  4. Linux服务器删除乱码文件和文件夹的方法
  5. 【转】GLONASS全球卫星导航系统
  6. AM解调的FPGA实现
  7. php之快速排序
  8. 解读TCP 四种定时器
  9. Chrome中xpath表达式巧妙获取
  10. if语句中同时判断多个条件的多种方法