#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct BSTNode
{
int data;
int bf;
struct BSTNode *lchild, *rchild;
}BSTNode, *BSTree;
BSTree init(int data)
{
BSTree T = (BSTree)malloc(sizeof(BSTNode));
T->data = data;
T->bf = 0;
T->lchild = NULL;
T->rchild = NULL;
return T;
}
BSTree rotateL(BSTree T)
{
BSTree tmp = T->rchild;
T->rchild = tmp->lchild;
tmp->lchild = T;
return tmp;
}
BSTree rotateR(BSTree T)
{
BSTree tmp = T->lchild;
T->lchild = tmp->rchild;
tmp->rchild = T;
return tmp;
}
BSTree LeftBalance(BSTree T)
{
if(T->lchild->bf == 1)
{
T->bf = T->lchild->bf = 0;
T = rotateR(T);
}
else if(T->lchild->bf == -1)
{
switch(T->lchild->rchild->bf)
{
case 1:T->lchild->bf = 0;T->bf = 1;break;
case -1:T->bf = 0;T->lchild->bf = 1;break;
case 0:T->bf = 0 ; T->lchild->bf = 0;break;
}
T->lchild->rchild->bf = 0;
T->lchild = rotateL(T->lchild);
T = rotateR(T);
}
return T;
}
BSTree RightBalance(BSTree T)
{
if(T->rchild->bf == 1)
{
switch (T->rchild->lchild->bf)
{
case 1:T->bf = 0;T->rchild->bf = -1;break;
case 0:T->bf = 0; T->rchild->bf = 0;break;
case -1:T->bf = 1;T->rchild->bf = 0;break;
}
T->rchild->lchild->bf = 0;
T->rchild = rotateR(T->rchild);
T = rotateL(T);
}
else if(T->rchild->bf == -1)
{
T->bf = 0;
T->rchild->bf = 0;
T = rotateL(T);
}
return T;
}
BSTree insert(BSTree T, int data, int* taller)
{
if(T == NULL)
{
T = init(data);
*taller = 1;
return T;
}
else if(T->data == data)
{
*taller = 0;
return T;
}
else if(data <T->data)
{
T->lchild = insert(T->lchild, data, taller);
if(*taller)
{
switch(T->bf)
{
case 1:T = LeftBalance(T);*taller = 0;break;
case 0:T->bf = 1;*taller = 1;break;
case -1:T->bf = 0;*taller = 0;break;
}
}
}
else if(data >T->data)
{
T->rchild = insert(T->rchild, data, taller);
if(*taller)
{
switch(T->bf)
{
case 1:T->bf = 0;*taller = 0;break;
case 0:T->bf = -1;*taller = 1;break;
case -1:T = RightBalance(T);*taller = 0;break;
}
}
}
return T;
}
BSTree create(int N)
{
BSTree T = NULL;
int i;
for(i = 0;i < N;i++)
{
int num;
scanf("%d", &num);
int a = 0;
int*taller = &a;
T = insert(T, num, taller);
}
return T;
}
int main()
{
int N;
scanf("%d", &N);
BSTree root = NULL;
root = create(N);
printf("%d", root->data);
return 0;
}
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *left, *right;
}node, *Node;
Node init(int data)
{
Node tmp = (Node)malloc(sizeof(struct node));
tmp->left = NULL;
tmp->right = NULL;
tmp->data = data;
return tmp;
}
Node LL(Node T)
{
Node tmp = T->left;
T->left = tmp->right;
tmp->right = T;
return tmp;
}
Node RR(Node T)
{
Node tmp = T->right;
T->right = tmp->left;
tmp->left = T;
return tmp;
}
Node LR(Node T)
{
T->left= RR(T->left);
T = LL(T);
return T;
}
Node RL(Node T)
{
T->right = LL(T->right);
T = RR(T);
return T;
}
int max(int x, int y)
{
return x>y?x:y;
}
int height(Node T)
{
if(T == NULL)return 0;
else return max(height(T->left), height(T->right))+1;
}
Node insert(Node T, int data, int* flag)
{
if(T == NULL)
{
T = init(data);
return T;
}
else if(data < T->data)
{
*flag = 1;
T->left = insert(T->left, data, flag);
int hl,hr;
hl = height(T->left);
hr = height(T->right);
if(abs(hl-hr) >= 2)
{
if(data < T->left->data) return LL(T);
else return LR(T);
}
}
else if(data > T->data)
{
*flag = 2;
T->right = insert(T->right, data, flag);
int hl,hr;
hl = height(T->left);
hr = height(T->right);
if(abs(hl-hr) >= 2)
{
if(data < T->right->data)return RL(T);
else return RR(T);
}
}
return T;
}
Node create(int N)
{
Node T = NULL;
int i;
for(i = 0;i < N;i++)
{
int num;
scanf("%d", &num);
int flag = 0;
T = insert(T, num, &flag);
}
return T;
}
int main()
{
int N;
scanf("%d", &N);
Node root = NULL;
root = create(N);
if(root)printf("%d", root->data);
return 0;
}