Pagini recente » Cod sursa (job #3211991) | Cod sursa (job #576696) | Cod sursa (job #2951977) | Cod sursa (job #505644) | Cod sursa (job #3179221)
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
int key;
int dimension;
struct Node *left;
struct Node *right;
};
int GetDimension(Node *node){
if(NULL==node)
return 0;
return node->dimension;
}
void InsertInTree(Node **root,int key){
if(NULL==(*root)){
(*root)=(Node *) malloc(sizeof(Node));
(*root)->key=key;
(*root)->dimension=1;
(*root)->left=NULL;
(*root)->right=NULL;
return;
}
Node *curr_node=(*root);
bool ok=false;
while(!ok){
if(key>curr_node->key){
curr_node->dimension+=1;
if(NULL==curr_node->right){
Node *temp=(Node *) malloc(sizeof(Node));
temp->key=key;
temp->dimension=1;
temp->right=NULL;
temp->left=NULL;
curr_node->right=temp;
ok=true;
}
else curr_node=curr_node->right;
}
else if(key<curr_node->key){
curr_node->dimension+=1;
if(NULL==curr_node->left){
Node *temp=(Node *) malloc(sizeof(Node));
temp->key=key;
temp->dimension=1;
temp->right=NULL;
temp->left=NULL;
curr_node->left=temp;
ok=true;
}
else curr_node=curr_node->left;
}
}
}
void OS_SELECT(Node **root,int index){
Node *curr_node=(*root);
int rank= GetDimension(curr_node->left)+1;
while(rank!=index && curr_node!=NULL){
if(rank>index) curr_node=curr_node->left;
else {
curr_node=curr_node->right;
index=index-rank;
}
rank= GetDimension(curr_node->left)+1;
}
printf("%d",curr_node->key);
}
int main() {
freopen("sdo.in","r",stdin);
freopen("sdo.out","w",stdout);
Node *root=NULL;
int N,x,k;
scanf("%d",&N);
scanf("%d",&k);
for(int i=0;i<N;i++) {
scanf("%d", &x);
InsertInTree(&root,x);
}
OS_SELECT(&root,k);
return 0;
}