【前缀树】java代码实现

原理

前缀树(字典树)用于将字符串拆解为多个字符,而后将这些字符依次插入树中。由根节点开始到各个叶子节点位置必为一个字符串,由根节点到各个非叶子节点组成字符串的子串。

代码实现

节点类

节点类构造
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);
            }
        }

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值