2018.10.5 Trie 封装 版本2
说明
- 以前版本(版本1)
- 改进:新增删除
del()
和查询操作find()
,并简化了代码 - 适用条件:01的Trie树,需要多棵…
- 你猜我说了什么 ?
上代码:
上不了代码是什么玩意?
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
const int N = 100007;
bool brk[32];
struct trie{
struct tnode{
bool a;
tnode *fa, *lt, *rt;
tnode(){
fa = lt = rt = NULL;
}
};
int cnt;
tnode *hd;
tnode *fst[32];
trie(){
cnt = 0;
hd = NULL;
for(int i=0; i<32; ++i) fst[i] = NULL;
}
tnode *getnew(){
tnode *a = new tnode;
return a;
}
tnode *getnxt(int x,tnode *itr){
return x ? (*itr).rt : (*itr).lt ;
}
void delnode(tnode *x){
delete x;
}
} thet;
void broke(int x,bool *w){
for(int i=0; i<32; ++i){
w[i] = x & 1;
x >>= 1;
}
}
void add(int val,int dpth,trie *x,trie::tnode *itr){
trie::tnode *itr2, *itr3;
itr2 = (*x).getnew();
(*x).fst[dpth] = itr2;
if( !val ) itr3 = (*itr).lt;
else itr3 = (*itr).rt;
itr3 = itr2;
(*itr3).fa = itr;
(*itr2).a = val;
}
void add(int x,trie *tr){
broke(x,brk);
int i, j;
trie::tnode *itr = (*tr).hd;
for( i=31; i>=0; --i){
itr = (*tr).getnxt(brk[i],itr);
if( itr == NULL ) add(brk[i],i,tr,itr);
}
}
void del(int x,trie *tr){
broke(x,brk);
int i, j;
trie::tnode *itr = (*tr).hd,
*itr2;
for( i=31; i>=0; --i){
itr = (*tr).getnxt(brk[i],itr);
if( itr == NULL ) return;
}
if( i < 0 ){
do{
itr2 = itr;
itr = (*itr).fa;
(*tr).delnode(itr2);
}while( (*itr).lt && (*itr).rt );
}
}
bool find(int x,trie *tr){
broke(x,brk);
int i, j;
trie::tnode *itr = (*tr).hd;
for( i=31; i>=0; --i){
itr = (*tr).getnxt(brk[i],itr);
if( itr == NULL ) return false;
}
return true;
}
int main(){
int n, a[N];
int i, j;
scanf("%d", &n);
for( i=1; i<=n; ++i){
scanf("%d", a+i);
add(a[i],&thet);
}
return 0;
}
// 备注:我的缩进好像在新版编辑器上全部废掉了。。。。
- 终于成功放上代码了
其中,必须的有这些:
struct trie;
//-------------
int brk[]; //用来存下分出来的各位
void broke(); //拆分一个数的各位(2进制)
//-------------
bool find();
//-------------
void add();
void add();
//-------------
void del();
//-------------
// 头文件我就不说了
总结:
- 这是一个不完全封装的版本,相比上一个版本只是简化了代码、补充了必要的常用功能
- 另外,因为这是为
01 Trie树
而写的,所以可以用二叉树结构写,这样我就不要用更麻烦的支持多个“儿子”的边链表
了
初衷:
·我本来是想用一种快速的、节省空间的方式存下一个数的所有质因数,方便我判断一个数能否整除另一个数