大家记得通过这个图,更好理解
一般有两种方法建立,一个是链式,一个就是二维数组。
下面这个模板是链式,
数据结构:
struct Tree
{
int num;//判断此节点是否为空的(就是一棵树的结束点)
Tree* next[26];//这个是这棵树的子节点
Tree()
{
num = 0;
for (int i = 0; i < 26; i++)
{
next[i] = NULL;
}
}//这是一棵树
}*root;//建立一个树根
插入:
void insert(Tree * p, char* s)
{
//int i = 0;
int n = strlen(s);
/*while (s[i])//当这个字符串的某一个元素不为空的时候
{*/
for(int i =0;i<n;++i)
{
int x = s[i] - 'a';//看这个元素在哪里?
if (p->next[x] == NULL)//然后看这棵树的子节点有没有这个元素如果没有
{
p->next[x] = new Tree();//就在这棵树的此节点重新建立一棵子树
}
p = p->next[x];//p指向他的子树,这一点你就可以知道了所有字符串的元素原来他们都是主仆关系没有相同的等级关系!
//i++;//继续遍历
}
p->num++;
}//插入字符
查找:
int find(Tree * p, char* s)
{
int i = 0, ans = 0;//寻找树的元素,ans是结果!
while (s[i])//当他不为空的时候就是字符串还有的时候
{
int n = s[i] - 'a';//找到他在这个树的节点
if (p->next[n])//如果节点不为空
{
p = p->next[n];//p就指向该节点
ans = p->num;//结果应该为1
i++;
}
else
{
return 0;
}
}
return ans;
}
整体代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<set>
//#include<unordered_map>
#include<ctime>
using namespace std;
typedef long long ll;
#define mst(ss,b) memset(ss,b,sizeof(ss));
#define rep(i,k,n) for(int i=k;i<=n;i++)
#define INF 0x3f3f3f3f
const ll maxn = 5e4 + 10;
char str[50010][20];
struct Tree
{
int num;//判断此节点是否为空的(就是一棵树的结束点)
Tree* next[26];//这个是这棵树的子节点
Tree()
{
num = 0;
for (int i = 0; i < 26; i++)
{
next[i] = NULL;
}
}//这是一棵树
}*root;//建立一个树根
int count1;
void insert(Tree * p, char* s)
{
//int i = 0;
int n = strlen(s);
/*while (s[i])//当这个字符串的某一个元素不为空的时候
{*/
for(int i =0;i<n;++i)
{
int x = s[i] - 'a';//看这个元素在哪里?
if (p->next[x] == NULL)//然后看这棵树的子节点有没有这个元素如果没有
{
p->next[x] = new Tree();//就在这棵树的此节点重新建立一棵子树
}
p = p->next[x];//p指向他的子树,这一点你就可以知道了所有字符串的元素原来他们都是主仆关系没有相同的等级关系!
//i++;//继续遍历
}
p->num++;
}//插入字符
int find(Tree * p, char* s)
{
int i = 0, ans = 0;//寻找树的元素,ans是结果!
while (s[i])//当他不为空的时候就是字符串还有的时候
{
int n = s[i] - 'a';//找到他在这个树的节点
if (p->next[n])//如果节点不为空
{
p = p->next[n];//p就指向该节点
ans = p->num;//结果应该为1
i++;
}
else
{
return 0;
}
}
return ans;
}
int main()
{
count1 = 0;//用于记录单词个数的
root = new Tree();
while (gets_s(str[count1]))
{
insert(root, str[count1++]);
}//插入1
}