Trie—单词查找树
性质:
1.根节点不包含字符,除根节点外的每一个节点都只包含一个字符。3.每个节点的所有子节点包含的字符都不相同。
2.从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
优点:
1.查询快。对于长度为m的键值,最坏情况下只需花费O(m)的时间;而BST需要O(m log n)的时间。
2.当存储大量字符串时,Trie耗费的空间较少。因为键值并非显式存储的,而是与其他键值共享子串。
操作:
1.插入字符串
1).设置当前节点为根节点,设置当前字符为插入字符串中的首个字符;
2).在当前节点的子节点上搜索当前字符,若存在,则将当前节点设为值为当前字符的子节点;否则新建一个值为当前字符的子节点,并将当前结点设置为新创建的节点。
3).将当前字符设置为串中的下个字符,若当前字符为0,则结束;否则转2.
2.查找字符串
搜索过程与插入操作类似,当字符找不到匹配时返回假;若全部字符都存在匹配,判断最终停留的节点是否为树叶,若是,则返回真,否则返回假。
3.删除字符串
首先查找该字符串,边查询边将经过的节点压栈,若找不到,则返回假;否则依次判断栈顶节点是否为树叶,若是则删除该节点,否则返回真。
4.显示字符串
显示该树上所有的字符串。
C++程序实现:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
const int MaxBranchSize=26;
class TrieNode{
public:
string word;
//int count;
TrieNode* nextBranch[MaxBranchSize];
public:
TrieNode(){
word = "";
//count = 0;
memset(nextBranch,0,sizeof(TrieNode*) * MaxBranchSize);
}
};
class Trie{
public:
Trie(){
pRoot = new TrieNode();
}
~Trie(){
//cout<<"deconstructor"<<endl;
}
void insert(string s);
bool search(string s);
void remove(string s);
void printall();
private:
TrieNode* pRoot;
void print(TrieNode* pRoot);
};
void Trie::insert(string s){
int index;//代表第几个字母的下标
TrieNode* p=pRoot;
for(int i=0;i<s.size();i++){
index=s[i]-'a';
if(NULL == p->nextBranch[index]){
p->nextBranch[index] = new TrieNode();
}
p = p->nextBranch[index];
}
//p->count++;
if("" == p->word){
p->word = s;
}
}
bool Trie::search(string s){
int index;
TrieNode* p = pRoot;
for(int i=0;i<s.size();i++){
index = s[i]-'a';
if(p->nextBranch[index] == NULL){
return false;
}
p = p->nextBranch[index];
}
if(p->word == s){return true;}
return false;
};
//删除某一字符
void Trie::remove(string s){
int index;
TrieNode* p = pRoot;
for(int i=0;i<s.size();i++){
index = s[i]-'a';
if(p->nextBranch[index] == NULL){
cout<<"该字符串不存在"<<endl;
return;
}
p = p->nextBranch[index];
}
p->word = "";//如果找到了则令该字符串为空
}
void Trie::printall(){
print(pRoot);
}
void Trie::print(TrieNode* pRoot){
if(NULL == pRoot){
return;
}
if("" != pRoot->word){
cout << pRoot->word << endl;
}
for(int i=0;i<MaxBranchSize;i++){
print(pRoot->nextBranch[i]);
}
};
int main(){
Trie t;
//插入功能
t.insert("apply");
t.insert("apple");
t.insert("blue");
//打印功能
t.printall();
//查找功能
if(t.search("app")){
cout<<"true"<<endl;
}
else{
cout<<"false"<<endl;
}
if(t.search("apply")){
cout<<"true"<<endl;
}
else{
cout<<"false"<<endl;
}
//删除功能
t.remove("apply");
t.printall();
return 0;
}
输出:
apple
apply
blue
false
true
apple
blue