2021最新Java实现trie树 适合在文章查询单词(基本每行都有注释)

这个有问题留个言哈 谢谢了

直接贴代码了

import java.util.TreeMap;

public class Trietree {
    //这个树结构的作用是用来查询单词的 在查询的时候的复杂度很低
    //node就是里面的节点 节点包括一个布尔类型 和一个treemap
    //isword的作用是为了 看这个单词在这里有没有完  treemap是为了查看下一个里面包含一个单词和一个node
    public class Node {
        public boolean isword;
        public TreeMap<Character, Node> next;
        //其实这个也是有缺点的   它必须为每个node创建一个treemap
        //性能会减弱

        
        public Node(boolean isword) {
            this.isword = isword;
            next = new TreeMap<>();
        }

        public Node() {
            this.isword = false;
        }

    }

    private Node root;//里面应该包含一个根节点
    private int size;

    public Trietree() {
        root = new Node();
        size = 0;
    }

    public int getSize() {
        return size;
    }

    //在树中添加元素
    public void add(String word) {
        Node cur = root;//先创建一个根节点
        for (int i = 0; i < word.length(); i++) {
            char c = word.charAt(i);
            //if后面的操作就是说 如果cur后面为空的话 直接加就完了
            //如果不为空的话 那么查看下一个值
            if (cur.next.get(c) == null) {
                cur.next.put(c, new Node());
            }
            cur = cur.next.get(c);

        }
        //在for完后 说明已经添加完毕 那么剩下就只是需要看 下面的if是为了判断以前这个isword是不是结束了这个单词
        if (!cur.isword) {
            cur.isword = true;
            size++;
        }

    }
    //判断一个单词是否包含在树中
    public boolean contains(String word){
        Node cur=root;
        for (int i = 0; i < word.length(); i++) {
            char c = word.charAt(i);
            if (cur.next.get(c) == null) {
                return false;
            }
            cur = cur.next.get(c);

        }
        return  cur.isword;//这里是因为可以有得单词它被包含到了其他单词的里面 比如pat patern 所以只有
        //它的isword结束那么才说明了树里面有它

    }
    //给一个单词的前缀 看树里有没有以这个为前缀的单词
    public  boolean iscontains(String qian){
        Node cur=root;
        for (int i = 0; i < qian.length(); i++) {
            char c = qian.charAt(i);
            if (cur.next.get(c) == null) {
                return false;
            }
            cur = cur.next.get(c);

        }
        return  true;//这个就很好理解了  就是为了看有没有这个东西的

    }
    //这个方法比较特殊 是查询一个这样的单词 比如w。。。a 那么这个。。。我们是不知道的 所以就是在树的结构中去
    //查询看这个东西 就是直到它的开始和结束
    //所以在树的结构中 使用递归可以更简单的知道这个是怎么进行的
    public  boolean specontains(String word){
       return search(root,word,0);

    }
    //可以去看leet211 应该类似  我不是很确定是不是这个题
    private boolean search(Node node,String word,int index){
        if(index==word.length()){ //递归终止的条件 当这个单词已经被查找到最后一个位置
            return node.isword;//此时上传这个的作用是看此时是否已经到了这个树中所含单词的结尾 是就是true
        }
        char c=word.charAt(index);
        if(c!='.'){//此时这个点的意思就是我上面说的那个... 一样的东西 那个w。。。a的。
            if(node.next.get(c)==null){
                return  false;
            }else return search(node.next.get(c),word,index+1);
            //如果找到了这个值 那么就再去寻找下一个值 使用递归
        }else {
            //如果c所包含的值为。 那么遍历所有树的下一层 下所有的下一层里面进行递归 来查看是否包含这个值
            for(char nextchar:node.next.keySet()){
                if(search(node.next.get(nextchar),word,index+1)){
                    return true;
                }
            }
            return  false;
        }
    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值