java写一个 Trie 树并实现搜索词自动补全。

在 Java 中,Trie 树(也称为前缀树)是一种用于高效存储和检索字符串集合的数据结构,特别适合实现自动补全功能。下面是一个简单的 Trie 树实现,包括插入和自动补全功能:

javaCopy Codeimport java.util.ArrayList;import java.util.List;class TrieNode {
    TrieNode[] children;    boolean isEndOfWord;    public TrieNode() {
        children = new TrieNode[26]; // 假设只处理小写字母 a-z
        isEndOfWord = false;
    }
}public class Trie {    private TrieNode root;    public Trie() {
        root = new TrieNode();
    }    // 插入一个单词到 Trie 树中
    public void insert(String word) {        TrieNode node = root;        for (char c : word.toCharArray()) {            int index = c - 'a';            if (node.children[index] == null) {
                node.children[index] = new TrieNode();
            }
            node = node.children[index];
        }
        node.isEndOfWord = true;
    }    // 搜索前缀并返回所有可能的补全单词
    public List autoComplete(String prefix) {
        List results = new ArrayList<>();        TrieNode node = root;        
        // 找到前缀的最后一个节点
        for (char c : prefix.toCharArray()) {            int index = c - 'a';            if (node.children[index] == null) {                return results; // 如果前缀不存在,返回空列表
            }
            node = node.children[index];
        }        // 从前缀的最后一个节点开始进行 DFS 搜索所有可能的单词
        findAllWords(node, prefix, results);        return results;
    }    private void findAllWords(TrieNode node, String prefix, List results) {        if (node.isEndOfWord) {
            results.add(prefix);
        }        for (int i = 0; i < 26; i++) {            if (node.children[i] != null) {
                findAllWords(node.children[i], prefix + (char) (i + 'a'), results);
            }
        }
    }    public static void main(String[] args) {        Trie trie = new Trie();
        trie.insert("apple");
        trie.insert("app");
        trie.insert("application");
        trie.insert("bat");
        trie.insert("ball");
        List suggestions = trie.autoComplete("app");
        System.out.println("Suggestions for 'app': " + suggestions);
    }
}

代码说明:

  1. TrieNode 类‌:

    • 每个节点有一个  children 数组,用于存储指向子节点的引用(假设只处理小写字母  a-z)。
    • isEndOfWord 标志用于表示该节点是否是某个单词的结尾。
  2. Trie 类‌:

    • insert 方法用于将单词插入到 Trie 树中。
    • autoComplete 方法用于根据给定的前缀返回所有可能的补全单词。
    • findAllWords 是一个辅助方法,用于从给定节点开始进行深度优先搜索(DFS),以找到所有以该节点为前缀的单词。
  3. 自动补全‌:

    • 首先,根据前缀找到 Trie 树中对应的节点。
    • 然后,从该节点开始进行 DFS,收集所有可能的单词。

这个实现假设输入的单词只包含小写字母  a-z。如果需要处理其他字符集,可以相应地调整  children 数组的大小和索引计算方式。


http://xuexiao.zgjzs.org

http://jianzhu.zgjzs.org

http://gongcheng.zgjzs.org

http://sheji.zgjzs.org

http://fangwu.zgjzs.org

http://jiaoyu.zgjzs.org

http://kejian.zgjzs.org

http://chengshi.zgjzs.org

http://guihua.zgjzs.org

http://jiaju.zgjzs.org

http://jianli.zgjzs.org

http://zhucai.zgjzs.org

http://jichu.zgjzs.org

http://gaosu.zgjzs.org

http://ditu.zgjzs.org

http://lvyou.zgjzs.org

http://zhishi.zgjzs.org

http://shipin.zgjzs.org

http://peixun.zgjzs.org

http://wenhua.zgjzs.org

http://gongsi.zgjzs.org

http://renwu.zgjzs.org

http://xinwen.zgjzs.org

http://zixun.zgjzs.org

http://anli.zgjzs.org

http://guwen.zgjzs.org

http://zhaopin.zgjzs.org

http://yingxiao.zgjzs.org

http://guanli.zgjzs.org

http://peitao.zgjzs.org

http://jixie.zgjzs.org

http://zhuangxiu.zgjzs.org

http://anquan.zgjzs.org

http://chengguo.zgjzs.org

http://baogao.zgjzs.org

http://chengjiu.zgjzs.org

http://zhanshi.zgjzs.org

http://huodong.zgjzs.org

http://huiyi.zgjzs.org

http://tongji.zgjzs.org

http://jiaoliu.zgjzs.org

http://keti.zgjzs.org

http://jingcai.zgjzs.org

http://tuandui.zgjzs.org

http://jingying.zgjzs.org

http://wenjian.zgjzs.org

http://baoming.zgjzs.org

http://wangzhan.zgjzs.org

http://xiazai.zgjzs.org

http://chengxin.zgjzs.org

http://nanzhuang.shangpin.org

http://xiezi.shangpin.org

http://baozi.shangpin.org

http://yundong.shangpin.org

http://shuma.shangpin.org

http://diannao.shangpin.org

http://shouji.shangpin.org

http://jiajv.shangpin.org

http://canju.shangpin.org

http://muying.shangpin.org

http://shipin.shangpin.org

http://jiushui.shangpin.org

http://jiafang.shangpin.org

http://shouna.shangpin.org

http://meishi.shangpin.org

http://lingshi.shangpin.org

http://chufang.shangpin.org

http://jianshen.shangpin.org

http://qiche.shangpin.org

http://yundongyi.shangpin.org

http://bangong.shangpin.org

http://wenju.shangpin.org

http://shuben.shangpin.org

http://dianqi.shangpin.org

http://jiadian.shangpin.org

http://fanghuo.shangpin.org

http://fangshui.shangpin.org

http://fangdao.shangpin.org

http://muyuan.shangpin.org

http://fengshui.shangpin.org

http://zhuangxiu.shangpin.org

http://gongju.shangpin.org

http://chaju.shangpin.org

http://weisheng.shangpin.org

http://xiangbao.shangpin.org

http://yanjing.shangpin.org

http://shoubiao.shangpin.org

http://shipinbao.shangpin.org

http://jiazhuang.shangpin.org

http://chuanglian.shangpin.org

http://yundongxie.shangpin.org

http://tiyu.shangpin.org

http://luyou.shangpin.org

http://jiejing.shangpin.org

http://shumaerji.shangpin.org

http://chejian.shangpin.org

http://xihu.shangpin.org

http://zhizao.shangpin.org

http://cheshen.shangpin.org

http://zhinen.shangpin.org

http://xinwen.snjrw.org

http://zixun.snjrw.org

http://keji.snjrw.org

http://jiaoyu.snjrw.org

http://renwu.snjrw.org

http://wenhua.snjrw.org

http://lishi.snjrw.org

http://jingji.snjrw.org

http://caijing.snjrw.org

http://jinrong.snjrw.org

http://touzi.snjrw.org

http://fangchan.snjrw.org

http://chanye.snjrw.org

http://gongye.snjrw.org

http://qiche.snjrw.org

http://shuma.snjrw.org

http://yule.snjrw.org

http://dianying.snjrw.org

http://yinyue.snjrw.org

http://meiti.snjrw.org

http://hulianwang.snjrw.org

http://chuangye.snjrw.org

http://gongsi.snjrw.org

http://baike.snjrw.org

http://zhishi.snjrw.org

http://wenxue.snjrw.org

http://yishu.snjrw.org

http://zhanlan.snjrw.org

http://huodong.snjrw.org

http://jiaoliu.snjrw.org

http://keti.snjrw.org

http://xueshu.snjrw.org

http://wenjian.snjrw.org

http://baogao.snjrw.org

http://shuju.snjrw.org

http://diaocha.snjrw.org

http://mingren.snjrw.org

http://jiemu.snjrw.org

http://shipin.snjrw.org

http://zhuanlan.snjrw.org

http://zhuanti.snjrw.org

http://wangzhan.snjrw.org

http://wangluo.snjrw.org

http://zhanzhang.snjrw.org

http://shichang.snjrw.org

http://guanli.snjrw.org

http://anquan.snjrw.org

http://jishu.snjrw.org

http://xiazai.snjrw.org

http://wenzhang.snjrw.org

请使用浏览器的分享功能分享到微信等