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;
}