前缀树的java实现

 class Trie {
     //Trie的两个属性,指向子节点的指针数组和表示该节点是否为结尾的布尔值
     private Trie[] children;
     private boolean isEnd;
    
     //构造
     public Trie() {
         children = new Trie[26];
         isEnd = false;
     }
    
     //插入节点。
     public void insert(String word) {
         Trie node = this;//指针指向当前的根
         for (int i = 0; i < word.length(); i++) {
             char ch = word.charAt(i);//待插入的字符
             int index = ch - 'a';//参数
             //当前的节点为null,就新建一个节点
             if (node.children[index] == null) {
                 node.children[index] = new Trie();
             }
             //当前节点不为null,就将node沿指针移动到子节点
             node = node.children[index];
         }
         //完成插入后,就将此时node所指向的节点isEnd置为true
         node.isEnd = true;
     }
     //查询前缀树中是否含有本字符串,使用查询前缀和的函数得到节点node,
     //若返回的node不为null,则说明找到了word的前缀,且如果此时isEnd为true,说明node是叶子
     //则说明此时的word存在于前缀树中。
     public boolean search(String word) {
         Trie node = searchPrefix(word);
         return node != null && node.isEnd;
     }

     //查询前缀
     public boolean startsWith(String prefix) {
         //只要返回值不为null,说明搜索到了前缀的末尾就为true,否则为false
         return searchPrefix(prefix) != null;
     }

     private Trie searchPrefix(String prefix) {
         Trie node = this;//指针指向当前的根
         for (int i = 0; i < prefix.length(); i++) {
             //当前访问的字符及其参数
             char ch = prefix.charAt(i);
             int index = ch - 'a';
             //访问的节点不存在,就返回一个null
             if (node.children[index] == null) {
                 return null;
             }
             //访问的节点存在,就沿着指针指向的节点移动
             node = node.children[index];
         }
         return node;//最后搜索到了末尾就返回这个末尾的节点,说明存在这个前缀
     }
}

(46条消息) 前缀树详解-Java版_乐无声的博客-CSDN博客

更详细的内容参照以上链接哦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值