Pagini recente » Cod sursa (job #2884250) | Cod sursa (job #1908557) | Cod sursa (job #1099037) | Cod sursa (job #1712378) | Cod sursa (job #2313300)
#include <bits/stdc++.h>
using namespace std;
#define ARRAY_SIZE(arr) sizeof(arr)/sizeof(arr[0])
typedef struct node_t node_t;
struct node_t
{
int data;
int lCount;
node_t* left;
node_t* right;
};
node_t *insert_node(node_t *root, node_t* node)
{
/* A crawling pointer */
node_t *pTraverse = root;
node_t *currentParent = root;
// Traverse till appropriate node
while(pTraverse)
{
currentParent = pTraverse;
if( node->data < pTraverse->data )
{
/* We are branching to left subtree
increment node count */
pTraverse->lCount++;
/* left subtree */
pTraverse = pTraverse->left;
}
else
{
/* right subtree */
pTraverse = pTraverse->right;
}
}
/* If the tree is empty, make it as root node */
if( !root )
{
root = node;
}
else if( node->data < currentParent->data )
{
/* Insert on left side */
currentParent->left = node;
}
else
{
/* Insert on right side */
currentParent->right = node;
}
return root;
}
int k_smallest_element(node_t *root, int k)
{
int ret = -1;
if( root )
{
/* A crawling pointer */
node_t *pTraverse = root;
/* Go to k-th smallest */
while(pTraverse)
{
if( (pTraverse->lCount + 1) == k )
{
ret = pTraverse->data;
break;
}
else if( k > pTraverse->lCount )
{
/* There are less nodes on left subtree
Go to right subtree */
k = k - (pTraverse->lCount + 1);
pTraverse = pTraverse->right;
}
else
{
/* The node is on left subtree */
pTraverse = pTraverse->left;
}
}
}
return ret;
}
int main() {
int a, q, tip, k;
freopen ("nums.in", "r", stdin);
freopen ("nums.out", "w", stdout);
scanf ("%d", &q);
node_t* root = NULL;
while (q--) {
scanf ("%d", &tip);
if (tip == 1) {
scanf ("%d", &a);
node_t* new_node = NULL;
new_node = (node_t *)malloc( sizeof(node_t) );
new_node->data = a;
new_node->lCount = 0;
new_node->left = NULL;
new_node->right = NULL;
/* insert into BST */
root = insert_node(root, new_node);
}
else {
scanf ("%d", &k);
printf ("%d\n", k_smallest_element (root, k));
}
}
return 0;
}