#include<bits/stdc++.h>
using namespace std;
struct node
{
int data;
//int h;
node *l,*r;
};
int geth(node *root)
{
if(root == NULL)
return 0;
return max(geth(root->l),geth(root->r))+1;
}
node *ll(node *root)//右旋
{
node *p;
p = root->l;
root->l = p->r;
p->r = root;
//root->h = geth(root);
//p->h = geth(p);
return p;
}
node *rr(node *root)//左旋
{
node *p;
p = root->r;
root->r = p->l;
p->l = root;
//root->h = geth(root);
//p->h = geth(p);
return p;
}
node *lr(node *root)//先左旋后右旋
{
root->l = rr(root->l);
root = ll(root);
return root;
}
node *rl(node *root)//先右旋后左旋
{
root->r = ll(root->r);
root = rr(root);
return root;
}
node *creat(node *root, int x)
{
if(root == NULL)
{
node *t;
t = new node();
t->data = x;
t->l = NULL;
t->r = NULL;
//t->h = 1;
root = t;
return t;
}
if(x>root->data)//插入的值比根大
{
root->r = creat(root->r,x);//递归右子树和根
}
else
{
root->l = creat(root->l,x);//递归左子树和根
}
if(geth(root->l)-geth(root->r)>=2)//左子树比右子树高2
{
if(geth(root->l->l)>geth(root->l->r))//左孩子的左子树比左孩子的右子树高
{
root = ll(root);
}
else
{
root = lr(root);
}
}
if(geth(root->r)-geth(root->l)>=2)//右子树比左子树高2
{
if(geth(root->r->l)>geth(root->r->r))//右孩子的左子树比右孩子的右子树高
{
root = rl(root);
}
else
{
root = rr(root);
}
}
return root;
}
int main()
{
int n;
int x;
while(cin>>n)
{
node *tree = NULL;
while(n--)
{
cin>>x;
tree = creat(tree,x);
}
cout<<tree->data<<endl;
}
return 0;
}
https://paste.ubuntu.com/p/YD7B4DStKg/