Trie树

Trie树(又称字典树、前缀树)是一种树形结构,常用于字符串的查找、插入和删除等操作。Trie树以字符串的前缀为结点,每个结点的每个子节点对应一个字母,最终的叶子结点代表一个完整的字符串。

Trie树的特点在于每个结点只需要存储一个字母,因此可以很高效的维护一组字符串,并且可以通过查询每个结点的子树,快速查询是否存在某个字符串。因此Trie树常常被用于字典、字符串搜索等场景。

在Java中,可以通过自行实现Trie树的数据结构,也可以使用开源的NLP库,如Apache Lucene等,直接使用Trie树的实现。

这是一份 Java 实现 Trie 树的代码示例:

import java.util.HashMap;

class TrieNode {
    char c;
    HashMap children = new HashMap();
    boolean isLeaf;

    public TrieNode() {}

    public TrieNode(char c) {
        this.c = c;
    }
}

public class Trie {
    private TrieNode root;

    public Trie() {
        root = new TrieNode();
    }

    // 插入一个字符串
    public void insert(String word) {
        HashMap children = root.children;
        for (int i = 0; i < word.length(); i++) {
            char c = word.charAt(i);
            TrieNode t;
            if (children.containsKey(c)) {
                t = children.get(c);
            } else {
                t = new TrieNode(c);
                children.put(c, t);
            }
            children = t.children;
            // 设置单词的结尾
            if (i == word.length() - 1) {
                t.isLeaf = true;
            }
        }
    }

    // 检查一个字符串是否在Trie树中
    public boolean search(String word) {
        TrieNode t = searchNode(word);
        if (t != null && t.isLeaf) {
            return true;
        } else {
            return false;
        }
    }

    // 检查一个字符串是否以前缀的形式出现在Trie树中
    public boolean startsWith(String prefix) {
        if (searchNode(prefix) == null) {
            return false;
        } else {
            return true;
        }
    }

    public TrieNode searchNode(String str) {
        Map children = root.children;
        TrieNode t = null;
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (children.containsKey(c)) {
                t = children.get(c);
                children = t.children;
            } else {
                return null;
            }
        }
        return t;
    }
}

你可能感兴趣的:(数据结构,java,java,开发语言)