0分求调
查看原帖
0分求调
789769
_xiaofu_楼主2025/1/16 14:26

0pts 过了最后一点 指针BST 求调

https://www.luogu.com.cn/record/198503352

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int m=0;
struct BSTnode{
    int data;
    BSTnode *l,*r,*father;
};
BSTnode *head=NULL;
struct TreePointer{
    BSTnode* now;
}*pointer;
BSTnode* createtree(int data){
    BSTnode *creation=new BSTnode;
    creation->data=data;
    creation->l=NULL;
    creation->r=NULL;
    creation->father=NULL;
    return creation;
}
BSTnode* createnode(int data=0){
    BSTnode *creation=new BSTnode;
    creation->data=data;
    creation->l=NULL;
    creation->r=NULL;
    creation->father=NULL;
    return creation;
}
BSTnode *findnode(BSTnode *root,int data){
    pointer->now=root;
    while(pointer->now!=NULL){
        if(pointer->now->data==data){
            return pointer->now;
        }
        else if(pointer->now->data>data){
            pointer->now=pointer->now->l;
        }
        else{
            pointer->now=pointer->now->r;
        }
    }
    return NULL;
}
bool insertnode(BSTnode* root,int data){
    if(data>root->data){
        if(root->r==NULL){
            BSTnode *node=createnode(data);
            node->father=root;
            root->r=node;
            return 0;
        }
        else
            insertnode(root->r,data);
    }
    else if(data<root->data){
        if(root->l==NULL){
            BSTnode *node=createnode(data);
            node->father=root;
            root->l=node;
            return 0;
        }
        else
            insertnode(root->l,data);
    }
    return 1;
}
// int search(BSTnode *root){
//     if(root==NULL)return 0;
//     int a=search(root->l);
//     int b=search(root->r);
//     return a+b+1;
// }
int searchBigger(BSTnode *root,int data){
    if(root==NULL)return 0;
    return ((root->data>data)? 1:0)+searchBigger(root->l,data)+searchBigger(root->r,data);
}
int searchSmaller(BSTnode *root,int data){
    if(root==NULL)return 0;
    return ((root->data<data)? 1:0)+searchSmaller(root->l,data)+searchSmaller(root->r,data);
}
int getFront(BSTnode *root){
    if(root==NULL){return -2147483647;}
    if(root->l==NULL){
        if(root->father!=NULL){
            if(root->father->data<root->data){return root->father->data;}
            else {return -2147483647;}
        }
    }
    else{
        pointer->now=root->l;
        int cnt=pointer->now->data;
        while(pointer->now->r){
            pointer->now=pointer->now->r;
            cnt=pointer->now->data;
        }
        return cnt;
    }
    return -2147483647;;
}
int getBack(BSTnode *root){
    if(root==NULL)return 2147483647;
    if(root->r==NULL){
        if(root->father!=NULL){
            if(root->father->data>root->data){return root->father->data;}
            else {return 2147483647;}
        }
    }
    else{
        pointer->now=root->r;
        int cnt=pointer->now->data;
        while(pointer->now->l){
            pointer->now=pointer->now->l;
            cnt=pointer->now->data;
        }
        return cnt;
    }
    return 2147483647;
}
int getgrade(BSTnode* root,int grade){
    if(root==NULL)return 0;
    int k=searchSmaller(head,root->data)+1;
    if(k==grade){m=root->data;}
    else if(k<grade){getgrade(root->r,grade);}
    else {getgrade(root->l,grade);}
    return m;
}
int main(){
    bool flag=0;
    pointer=new TreePointer;
    // head=createtree(10);
    // insertnode(head,1);
    // insertnode(head,4);
    // insertnode(head,5);
    // insertnode(head,25565);
    // insertnode(head,7283743);
    // cout<<getgrade(head,6)<<endl;
    // cout<<getFront(head)<<endl;
    // cout<<getBack(findnode(head,25565))<<endl;
    // cout<<searchBigger(head,1)<<endl;
    int _CRTIMPGETTING;
    cin>>_CRTIMPGETTING;
    while(_CRTIMPGETTING--){
        int a,b;
        cin>>a>>b;
        switch(a){
            case 1:
                cout<<searchSmaller(head,b)+1<<endl;
                break;
            case 2:
                m=0;
                cout<<getgrade(head,b)<<endl;
                break;
            case 3:
                cout<<getFront(findnode(head,b))<<endl;
                break;
            case 4:
                cout<<getBack(findnode(head,b))<<endl;
                break;
            case 5:
            if(!flag)
                {head=createtree(b);flag=1;}
            else
                insertnode(head,b);
            break;
        }
    }
    delete pointer;
    return 0;
}
2025/1/16 14:26
加载中...