平衡二叉树的建立是基于二叉排序树的
#include <bits/stdc++.h>
using namespace std;
struct Tree
{
int date;
Tree *left;//左子树
Tree *right;//右子树
};
int Hight(Tree *T)//求数的深度
{
int LH, RH, H;
if(T == NULL) H = 0;
else
{
LH = Hight(T->left);
RH = Hight(T->right);
H = max(LH, RH)+1;
}
return H;
}
Tree *LL(Tree *t2)//左侧单旋转
{
Tree *t1 = t2->left;
t2->left = t1->right;
t1->right = t2;
return t1;
}
Tree *RR(Tree *t2)//右侧单旋转
{
Tree *t1 = t2->right;
t2->right = t1->left;
t1->left = t2;
return t1;
}
Tree *LR(Tree *t2)//左侧双旋转
{
t2->left = RR(t2->left);
return LL(t2);
}
Tree *RL(Tree *t2)//右侧双旋转
{
t2->right = LL(t2->right);
return RR(t2);
}
Tree *creat(Tree *T, int m)//平衡二叉树的构建过程
{
if(T==NULL)
{
T = new Tree();
T->date = m;
T->right = NULL;
T->left = NULL;
return T;
}
if(m < T->date)
{
T->left = creat(T->left, m);
int l = Hight(T->left);
int r = Hight(T->right);
if(l-r>=2 || l-r<=-2)
{
if(m < T->left->date)
T = LL(T);
else T = LR(T);
}
}
else{
T->right = creat(T->right,m);
int l = Hight(T->left);
int r = Hight(T->right);
if(l-r>=2 || l-r<=-2)
{
if(m > T->right->date)
T = RR(T);
else T = RL(T);
}
}
return T;
}
int main()
{
int i, n, m;
cin>>n;
Tree *root = NULL;
for(i=0; i<n; i++)
{
cin>>m;
root = creat(root, m);
}
cout<<root->date<<endl;
return 0;
}