#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
#include <queue>
#include <string>
#include <map>
#include <stack>
using namespace std;
//
// test.h
// test
//
// Created by 吴珝君 on 2018/12/31.
// Copyright © 2018年 闲着也是贤者. All rights reserved.
//
/************************************************************************/
/************************************************************************/
/*
并查集的实现
*/
/************************************************************************/
class TrieNode
{
public:
TrieNode()
{
path = 0;
end = 0 ;
for (int i =0 ; i < 26; i++)
{
nexts[i] =NULL ;//数组的值
}
}
public:
//存储元素个数
int path ; //经过某个路段的次数
int end; //以某个路段为结尾的次数
TrieNode *nexts[26];
};
class TrieTree
{
public:
TrieTree()
{
root = new TrieNode();
}
void insert(string word)
{
if (word =="")
{
return;
}
char buf[1024];
int length =word.copy(buf, word.length());
buf[length] = '\0';
TrieNode * node = root;
int index = 0;
for(int i = 0; i< length; i++)
{
index = buf[i] - 'a';
if (node->nexts[index] == NULL)
{
node->nexts[i] = new TrieNode();
}
node = node->nexts[index];
node->path++;
}
node->end++;
}
//删除某个词条
void deletes(string word)
{
if (search(word) == 0)
{
return ;
}
char buf[1024];
int length =word.copy(buf, word.length());
buf[length] = '\0';
TrieNode * node = root;
int index = 0;
for (int i = 0; i < length; i++)
{
index = buf[i] = 'a';
if (--node->nexts[index]->path == 0)
{
release(buf, i, length, node);
return;
}
}
node->end --;
}
void release(char *buf, int j, int length,TrieNode * node)
{
int index = 0;
stack<TrieNode *> s;
for (int i = j; i < length; i++)
{
index = buf[i] = 'a';
if (node->nexts[index]->path -1 == 0)
{
node= node->nexts[index];//这里需要手动释放内存
node->nexts[index] = NULL;
s.push(node);
}
}
while(!s.empty())
{
delete s.top();
s.pop();
}
}
//检索某个词条出现次数
int search(string word)
{
if (word == "")
{
return 0;
}
TrieNode * node = root;
char buf[1024];
int length =word.copy(buf, word.length());
buf[length] = '\0';
int index = 0;
for (int i =0; i < length ; i++)
{
index = buf[i] - 'a';
if (node->nexts[index] == NULL)
{
return 0;
}
node = node->nexts[index];
}
return node->end;
}
//检索某个前缀的出现次数 -- 就是字符终点的path的大小
//
private:
TrieNode *root;
};
int main()
{
system("pause");
return 0;
}