2018.10.5 Trie 封装 版本2

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树而写的,所以可以用二叉树结构写,这样我就不要用更麻烦的支持多个“儿子”的边链表

初衷:

·我本来是想用一种快速的、节省空间的方式存下一个数的所有质因数,方便我判断一个数能否整除另一个数

The End, Thanks for Reading

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值