Trie树学习1

23 篇文章 0 订阅
10 篇文章 0 订阅

Trie树,也称为字典数,前缀树,每个单词的每个字母按照顺序对应一个节点。有重合的前缀就共享节点。理想情况下(满的情况),假若所有的单词都是N长,则树共有N层,每层都是26个子节点。在程序上,将根节点编号为0,根节点不代表任何字符。

在程序的实现上,树可以用数组存储,也可以用指针实现,这里介绍简单的数组方法实现。

用一个child[i][j]保存节点i的编号为j的子节点序号,j对应26个字母,如果child[i][0] == 0,那么说明i节点下面没有a这个子节点。trie树中可以用 value[i]存储附加信息

附代码,参考刘汝佳大白书

#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>

using namespace std;

#define MAX_NODE 20000
#define sigma_size 26

struct Trie{
	int child[MAX_NODE][sigma_size];
	int value[MAX_NODE];
	int size;
	Trie(){
		size = 1;
		memset(child[0], 0, sizeof(child[0]));
	}

	int idx(char ch){
		return ch - 'a';
	}

	void Insert(char *str, int val){
		int u = 0, num = strlen(str);
		for(int i = 0; i < num; i++){
			int ch = idx(str[i]);
			if(!child[u][ch]){
				memset(child[size], 0, sizeof(child[size]));
				value[size] = 0;
				child[u][ch] = size++;
			}
			u = child[u][ch];
		}
		value[u] = val;
	}
	
	int Query(char *str){
		int u = 0, num = strlen(str);
		for(int i = 0; i < num; i++){
			int ch = idx(str[i]);
			if(child[u][ch]){
				u = child[u][ch];
			}
			else{
				return 0;
			}
		}
		return 1;
	}

};


int main(){
	Trie tree;
	tree.Insert("sun",0);
	tree.Insert("yan",0);
	tree.Insert("sin",0);
	cout<<tree.Query("sun");
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值