懒惰删除(lazy delete)的二叉搜索树模板(BST/Binary Search Tree)

本文介绍了一种使用C++实现的二叉搜索树结构,包括插入、删除、查找等核心操作,并提供了完整的代码示例。文章还展示了如何通过中序、前序和后序遍历来访问树中的元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值