【蓝桥云课】字典树Trie

文章展示了如何使用Java编程实现字典树(Trie树),用于高效地插入单词并进行查找操作。代码包括TrieNode类和TrieTree类,支持判断单词是否存在以及统计以特定前缀开头的单词数量。在示例中,插入了若干单词并进行了查找和前缀计数的测试。

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

字典树: 单词的查找树,也就是26叉树,部分结构如下:
在这里插入图片描述
程序代码:

class TrieNode {
	char value;// 当前结点存储的字符
	int num;// 有多少个单词经过了这个字符,从本字符到根就是这num个单词的前缀
	boolean isword;// 是否构成一个完整的单词,true为是
	TrieNode[] son;// 所有孩子存放在一个对象数组里,默认是26叉

	public TrieNode() {
		num = 1;// 至少有一个字符经过本字符
		isword = false;// 开始假定是false
		son = new TrieNode[26];// 本案例只考虑单词的26个字母
	}
}

public class TrieTree {
	TrieNode root;// 字典树的根

	public TrieTree() {
		root = new TrieNode();// 初始化根结点
	}

	// 建树的过程就是不断地往字典树里插入单词
	public void insertTrieTree(String s) {
		if (s == null || s.length() == 0)
			return;// 空串的处理
		TrieNode node = root;// 先获取到根,因为插入的时候要一个一个字符处理,node会变的
		char[] words = s.toCharArray();// 得到字符数组
		for (int i = 0; i < words.length; i++) {
			int distance = words[i] - 'a';// 计算当前字符是当前根的第多少个孩子
			if (node.son[distance] == null) {
				node.son[distance] = new TrieNode();
				node.son[distance].value = words[i];// 存入当前字符
			} else {
				node.son[distance].num++;// 经过当前字符的次数+1
			}
			node = node.son[distance];
		}
		node.isword = true;// 最后一个字符都存储完毕后,这个字符一定是单词的完整的结尾
	}

	// 给定单词,查找其是否在字典树里
	public boolean isContains(String s) {
		if (s == null || s.length() == 0)
			return false;// 空串的处理
		TrieNode node = root;// 先获取到根,因为插入的时候要一个一个字符处理,node会变的
		char[] words = s.toCharArray();// 得到字符数组
		for (int i = 0; i < words.length; i++) {
			int distance = words[i] - 'a';// 计算当前字符是当前根的第多少个孩子
			if (node.son[distance] != null) {
				node = node.son[distance];// 继续往下找
			} else {
				return false;
			}
		}
		return node.isword;
	}

	// 给定前缀返回有多少个单词以它作为前缀
	public int getPreFixNum(String prefix) {
		if (prefix == null || prefix.length() == 0)
			return 0;// 空串的处理
		TrieNode node = root;// 先获取到根,因为插入的时候要一个一个字符处理,node会变的
		char[] words = prefix.toCharArray();// 得到字符数组
		for (int i = 0; i < words.length; i++) {
			int distance = words[i] - 'a';// 计算当前字符是当前根的第多少个孩子
			if (node.son[distance] != null) {
				node = node.son[distance];// 继续往下找
			} else {
				return 0;
			}
		}
		return node.num;
	}

	public static void main(String[] args) {
		TrieTree tree = new TrieTree();
		String[] strs = { "banana", "band", "bee", "absolute", "acm", "acmer" };
		String[] prefix = { "ba", "b", "band", "abc", "acm" };
		for (String str : strs) {
			tree.insertTrieTree(str);
		}
		System.out.print("字典树中是否包含abc:");
		System.out.println(tree.isContains("abc"));
		System.out.print("字典树中是否包含acm:");
		System.out.println(tree.isContains("acm"));
		for (String str : prefix) {
			System.out.printf("%s的前缀为:%d\n", str, tree.getPreFixNum(str));
		}
	}
}

运行结果:

字典树中是否包含abc:false
字典树中是否包含acm:true
ba的前缀为:2
b的前缀为:3
band的前缀为:1
abc的前缀为:0
acm的前缀为:2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CS_木成河

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值