TireTree 字典树 (java 实现) -- 快速找词、字符串分词、词语补全

本文介绍了Trie树(又称字典树)的数据结构,通过Java实现树节点TreeNode,包括最大孩子指针数、字符存储、孩子节点指针数组和单词结束标志。讲解了Trie树如何实现快速查找单词和进行字符串分词的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

树节点TreeNode

  • static final int MAX_SIZE = 26; // 最大孩子指针数(针对全小写的单词)
  • char data; // 每个节点存储一个字符
  • TreeNode[] childs; // 指向孩子节点的指针数组
  • boolean isEnd; // 单词结束标志

TireTree结构和实现快速查找的原理

TireTree

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

class TreeNode{

    static final int MAX_SIZE = 26;
    char data;
    TreeNode[] childs;
    boolean isEnd;

    public TreeNode(){
        this.childs = new TreeNode[MAX_SIZE];
        this.isEnd = false;
    }

    public TreeNode(char ch){
        this.data = ch;
        this.childs = new TreeNode[MAX_SIZE];
        this.isEnd = false;
    }
}

// 字典树
public class TireTree {

    // 在字典树中创建词子树
    public void createTireTree(TreeNode node, String str) {
        char[] chars = str.toCharArray();
        int loc = 0;

        for(int i = 0, j = chars.length; i < j; i++) {

            // 字符映射下标
            loc = chars[i] - 'a';
            if(node.childs[loc] == null) {
                node.childs[loc] = new TreeNode(chars[i]);
            }
            node = node.childs[loc];
        }
        node.isEnd = true;
    }


    // 在字典树中查找某单词
    public boolean find(TreeNode node, String str) {
        char[] chars = str.toCharArray();
        int loc = 0;
        for(int i = 0, j = chars.length; i < j; i++) {
            loc = chars[i] - 'a';
            if(node.childs[loc] != null) {
                node = node.childs[loc];
            } else {
                return false;
            }

        }
        return node.isEnd;
    }


    // 连续字符串分词
    public List<String> stringToWords(TreeNode node, String str) {
        char[] chars = str.toCharArray();
        TreeNode p = node;

        List<String> list = new ArrayList<String>();
        StringBuffer sb = new StringBuffer();

        int loc = 0;
        for (int i = 0, j = chars.length; i < j; i++) {
            loc = chars[i] - 'a';
            if (p.childs[loc] != null) {
                sb.append(chars[i]);
                if (p.childs[loc].isEnd) {  // 如果单词结束
                    list.add(String.valueOf(sb));
                    sb.delete(0, sb.length());
                    p = node;
                } else {
                    p = p.childs[loc];
                }
            } else {
                return null;
            }
        }

        return list;
    }


    // 单词补齐
    public List<String> wordFill(TreeNode node, String str) {
        char[] chars = str.toCharArray();
        int loc = 0;

        List<String> list = new ArrayList<String>();
        StringBuffer sb = new StringBuffer();

        // 找到字符串末字符在字典树中的位置
        for (int i = 0, j = chars.length; i < j; i++) {
            loc = chars[i] - 'a';
            if (node.childs[loc] != null) {
                sb.append(chars[i]);
                node = node.childs[loc];
            } else {
                return null;
            }
        }

        // 子树将单词补齐
        scanFind(node, String.valueOf(sb), list);

        return list;
    }


    // 搜索子树
    public void scanFind(TreeNode node, String prefix,  List<String> list) {
        for (int i = 0, j = node.childs.length; i < j; i++) {
            if (node.childs[i] != null) {
                list.add(prefix + node.childs[i].data);
                scanFind(node.childs[i], prefix, list);
            }
        }
    }


    public static void main(String[] args) {
        TreeNode rood = new TreeNode();
        TireTree tree = new TireTree();

        String[] strs = {"public", "static", "void", "main", "maia", "maib", "maic"};
        for (int i = 0, j = strs.length; i < j; i++) {
            tree.createTireTree(rood, strs[i]);
        }

        System.out.println(tree.find(rood, "main") + "\n************************************************");

        String str1 = "publicstaticvoidmain";
        List<String> list1 = tree.stringToWords(rood, str1);
        Iterator iter1 = list1.iterator();
        while(iter1.hasNext()) {
            System.out.println(iter1.next());
        }

        System.out.println("************************************************");

        String str2 = "mai";
        List<String> list2 = tree.wordFill(rood, str2);
        Iterator iter2 = list2.iterator();
        while(iter2.hasNext()) {
            System.out.println(iter2.next());
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值