Trie_tree的入门笔记

66 阅读1分钟

特点

是一种树形结构,是一种哈希树的变种

应用于统计,排序和保存大量的字符串(但不限于字符串)。

利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高

性质

  • 根节点不包含字符,除根节点外每一个节点都只包含一个字符;
  • 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串;
  • 每个节点的所有子节点包含的字符都不相同。

实现字典树存储字符串

    // 记录前缀树的根节点
    TreeNode root;
    // 定义前缀树节点
    class TreeNode{
        TreeNode[] next;
        boolean isEnd;
        public TreeNode (){
            next = new TreeNode[26];
        }
    }
    // 初始化前缀树
    public Trie() {
        root = new TreeNode();
    }
    // 插入
    public void insert(String word) {
        TreeNode cur = root;
        for(char ch : word.toCharArray()){
            // 判断对应节点是否为空,如果为空,则直接插入
            if(cur.next[ch - 'a'] == null){
                cur.next[ch - 'a'] = new TreeNode();
            }
            // 继续插入下一个节点
            cur = cur.next[ch - 'a'];
        }
        // 将最后一个字符设置为结尾
        cur.isEnd = true;
    }
    // 查找单词
    public boolean search(String word) {
        TreeNode cur = root;
        for(char ch : word.toCharArray()){
            // 如果对应节点为空,则表明不存在这个单词,返回false
            if(cur.next[ch - 'a'] == null)
                return false;
            cur = cur.next[ch - 'a'];
        }
        // 检查最后一个字符是否是结尾
        return cur.isEnd;
    }
    // 查找前缀
    public boolean startsWith(String prefix) {
        TreeNode cur = root;
        for(char ch : prefix.toCharArray()){
            if(cur.next[ch - 'a'] == null)
                return false;
            cur = cur.next[ch - 'a'];
        }
        return true;
    }
}