原理
前缀树(字典树)用于将字符串拆解为多个字符,而后将这些字符依次插入树中。由根节点开始到各个叶子节点位置必为一个字符串,由根节点到各个非叶子节点组成字符串的子串。
代码实现
节点类
节点类构造
info字段表示字符串单个字符
afters表示该节点的子字符节点集合
char info;
HashSet<Point> afters;
插入方法
将一个字符传入,若已经存有拥有该字符的下一级子节点则将字符传递至下一子节点执行插入方法。
public Point add(char letter){
for(Point p:this.afters){
if(letter==p.info){
return p;
}
}
Point p = new Point(letter);
this.afters.add(p);
return p;
}
查询方法
符合则返回
public Point search(char letter){
for(Point p:this.afters){
if(letter==p.info){
return p;
}
}
return null;
}
树类
查询方法,将字符串拆解为char数组,逐个比较各个字符是否存在于树中,之后将字符串反向拼接返回
public String search(String str){
String ret = "";
char[] arr = str.toCharArray();
Point p = this.root;
for(char c:arr){
p=p.search(c);
if(p==null){
break;
}
ret +=c;
}
return ret;
}
测试
测试类
package TrieTree;
public class testMain {
public static void main(String[] args){
TreeSet t = new TreeSet();
t.add("int");
t.add("string");
t.add("byte");
t.add("boolean");
System.out.println("存在数据查询:"+t.search("int"));
System.out.println("冗余数据查询:"+t.search("ints"));
System.out.println("部分数据查询:"+t.search("in"));
//树型图展示
showTree(t.root,0);
}
public static void showTree(Point t,int level){
System.out.println(level+"------------------"+t.info);
for(Point p:t.afters){
if(p!=null){
showTree(p,level+1);
}
}
}
}
测试结果
存在数据查询:int
冗余数据查询:int
部分数据查询:in
0------------------0
1------------------s
2------------------t
3------------------r
4------------------i
5------------------n
6------------------g
1------------------i
2------------------n
3------------------t
1------------------b
2------------------y
3------------------t
4------------------e
2------------------o
3------------------o
4------------------l
5------------------e
6------------------a
7------------------n
完整代码
节点类
package TrieTree;
import java.util.HashSet;
public class Point {
char info;
HashSet<Point> afters;
Point(char info){
this.info = info;
afters = new HashSet<Point>();
}
public Point add(char letter){
for(Point p:this.afters){
if(letter==p.info){
return p;
}
}
Point p = new Point(letter);
this.afters.add(p);
return p;
}
public Point search(char letter){
for(Point p:this.afters){
if(letter==p.info){
return p;
}
}
return null;
}
}
树类
package TrieTree;
public class TreeSet {
Point root;
TreeSet(){
this.root = new Point('0');
}
public void add(String str){
char[] arr = str.toCharArray();
Point p = this.root;
for(char c:arr){
p = addToPoint(p,c);
}
}
private Point addToPoint(Point p,char a){
return p.add(a);
}
public String search(String str){
String ret = "";
char[] arr = str.toCharArray();
Point p = this.root;
for(char c:arr){
p=p.search(c);
if(p==null){
break;
}
ret +=c;
}
return ret;
}
}
测试类
package TrieTree;
public class testMain {
public static void main(String[] args){
TreeSet t = new TreeSet();
t.add("int");
t.add("string");
t.add("byte");
t.add("boolean");
System.out.println("存在数据查询:"+t.search("int"));
System.out.println("冗余数据查询:"+t.search("ints"));
System.out.println("部分数据查询:"+t.search("in"));
//树型图展示
showTree(t.root,0);
}
public static void showTree(Point t,int level){
System.out.println(level+"------------------"+t.info);
for(Point p:t.afters){
if(p!=null){
showTree(p,level+1);
}
}
}
}