#include <cstdio>
#define max(_x,_y) (((_x)<(_y))?(_y):(_x))
using namespace std;
//test reader
inline int readi(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
//tree node
struct Node;
typedef Node *Tr,*Pos;
struct Node{
//val:值域(可以通过修改值域数据类型的比较器控制比较规则),cnt:key值个数
int val,cnt;
//l:left-child,r:right-child,p:p:parent
Tr l,r,p;
//constructor
Node() {}
Node(int _v,Tr _p=NULL,int _c=1,Tr _l=NULL,Tr _r=NULL) { val=_v,cnt=_c,p=_p,l=_l,r=_r;}
};
Tr tree;
//inline search
Pos se(const Tr r,int key) {
Pos P=r;
for (Pos c=P;c;) {
if ((P=c)->val==key)return P;
if (key<c->val)c=c->l;
else c=c->r;
}
return P;
}
//insert
void ins(Tr &r,int key) {
Pos P=se(r,key);
if (P){
if(key==P->val)P->cnt++;
else ((key<P->val)?P->l:P->r)=new Node(key,P);
}
else r=new Node(key);
}
//lazy_delete
void del(Tr &r,int key) {
Pos P=se(r,key);
if (P&&key==P->val)P->cnt--;
}
//clear
void clear(Tr &r){
if(r->r)clear(r->r);
if(r->l)clear(r->l);
delete r;
r=NULL;
}
//search api
inline Pos sea(Tr r,int key) {
return (r=se(r,key))?((r->cnt>0&&(r->val)==key)?r:NULL):NULL;
}
//the height of tree
inline int hei(Tr r){
return r?(max(hei(r->l),hei(r->r))+1):-1;
}
//total_node in tree
inline int siz_node(Tr r){
return r?(siz_node(r->l)+siz_node(r->r)+1):0;
}
//total_key in tree
inline int siz_cnt(Tr r){
return r?(siz_cnt(r->l)+siz_cnt(r->r)+r->cnt):0;
}
//inorder_travesal
void inp(const Tr r){
if(!r)return ;
inp(r->l);
if(r->cnt>0)printf("%d ",r->val);
inp(r->r);
}
//postorder_travesal
void psp(const Tr r){
if(!r)return ;
psp(r->l);
psp(r->r);
if(r->cnt>0)printf("%d ",r->val);
}
// preorder_travesal
void prp(const Tr r){
if(!r)return ;
if(r->cnt>0)printf("%d ",r->val);
prp(r->l);
prp(r->r);
}
int main(){
char o[20];
while(~scanf("%s",o)){
switch(o[0]){
case 'i':
if(o[2]=='o')inp(tree),puts("");
else ins(tree,readi());
break;
case 'p':
if(o[1]=='o')psp(tree);else prp(tree);
puts("");break;
case 's':printf("%d\n",sea(tree,readi())==NULL);break;
case 'd':del(tree,readi());break;
case 'c':clear(tree);break;
case 't':
if(o[5])printf("%d\n",siz_node(tree));
else printf("%d\n",siz_cnt(tree));
break;
case 'h':
printf("%d\n",hei(tree));
break;
default:puts("error");
}
}
}
/*
test1:
insert 1
insert 2
insert 9
insert 8
insert 7
insert 8
insert 5
insert 99
insert 50
insert 40
insert 52
insert 88
height
6
preorder_travesal
1 2 9 8 7 5 99 50 40 52 88
inorder_travesal
1 2 5 7 8 9 40 50 52 88 99
postorder_travesal
5 7 8 40 88 52 50 99 9 2 1
total
12
total_node
11
insert 1
total
13
total_node
11
clear
total
0
insert 1
insert 2
insert -1
insert -2
insert -99
insert 100
inorder_travesal
-99 -2 -1 1 2 100
test2:
insert 1
insert 2
insert 9
insert 8
insert 7
insert 8
insert 5
insert 99
insert 50
insert 40
insert 52
insert 88
insert 1
search 1
0
delete 1
search 1
0
delete 1
search 1
1
delete 5
delete 9
delete 99
inorder_travesal
2 7 8 40 50 52 88
postorder_travesal
7 8 40 88 52 50 2
*/
懒惰删除(lazy delete)的二叉搜索树模板(BST/Binary Search Tree)
最新推荐文章于 2025-05-19 13:16:26 发布