AVL树的资料见这:http://blog.csdn.net/laziercs/article/details/8280074
实现代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
template <typename Tk,typename Tv>
struct Type
{
Tk key;
Tv val;
};
template <typename Tk,typename Tv>
Type<Tk,Tv> makepair(Tk key,Tv val)
{
Type <Tk,Tv> temp;
temp.key=key;
temp.val=val;
return temp;
}
template <typename Tk,typename Tv>
bool operator< (Type<Tk,Tv> a,Type<Tk,Tv> b)
{
return a.key<b.key;
}
template <typename Tk,typename Tv>
struct Treenode
{
struct Treenode<Tk,Tv> *left,*right;
int height;
Type<Tk,Tv> data;
};
#define node Treenode<Tk,Tv>
#define Node Treenode<Tk,Tv>*
int Max(int a,int b){return a<b?b:a;}
template <typename Tk,typename Tv>
class map
{
public:
Node head;
map(){head=NULL;}
map( map<Tk,Tv> &T)
{
head=Cpmem(T.head);
}
map<Tk,Tv> & operator=(map<Tk,Tv> &T)
{
Distory(head);
head=Cpmem(T.head);
return *this;
}
bool find(Type<Tk,Tv> pair)
{
Node t=Find(pair.key,head);
return t&&(t->data.val==pair.val);
}
void insert(Type<Tk,Tv> pair)
{
head=Insert(pair,head);
}
Tv &operator[](Tk key)
{
Node t=Find(key,head);
if(!t)
{
head=Insert(makepair(key,0),head);
t=Find(key,head);
}
return t->data.val;
}
~map()
{
Distory(head);
}
private:
int H(Node T);
Node Cpmem(Node T);
Node Rotate(Node T);
Node RightRotate(Node a);
Node LeftRotate(Node a);
Node LeftRightRotate(Node a);
Node RightLeftRotate(Node a);
Node Insert(Type<Tk,Tv> x, Node t);
Node Delete(Type<Tk,Tv> x, Node t);
Node Find(Tk key,Node t);
void Distory(Node t);
};
template <typename Tk,typename Tv>
Node map<Tk,Tv>::Cpmem(Node T)
{
if(!T)return NULL;
Node temp=new node;
temp->data=T->data;
temp->height=T->height;
temp->left=Cpmem(T->left);
temp->right=Cpmem(T->right);
return temp;
}
template <typename Tk,typename Tv>
void map<Tk,Tv>::Distory(Node t)
{
if(!t)return;
Distory(t->left);
Distory(t->right);
delete t;
}
template <typename Tk,typename Tv>
Node map<Tk,Tv>::Find(Tk key,Node t)
{
if(!t)return NULL;
if(key==t->data.key)return t;
else if(key<(t->data).key)
return Find(key,t->left);
else
return Find(key,t->right);
}
template <typename Tk,typename Tv>
int map<Tk,Tv>::H(Node T)
{
if(!T)return 0;
return T->height;
}
template <typename Tk,typename Tv>
Node map<Tk,Tv>::RightRotate(Node a)
{
Node b = a->left;
a->left = b->right;
b->right = a;
a->height = Max(H(a->left), H(a->right));
b->height = Max(H(b->left), H(b->right));
return b;
}
template <typename Tk,typename Tv>
Node map<Tk,Tv>::LeftRotate(Node a)
{
Node b = a->right;
a->right = b->left;
b->left = a;
a->height = Max(H(a->left), H(a->right));
b->height = Max(H(b->left), H(b->right));
return b;
}
template <typename Tk,typename Tv>
Node map<Tk,Tv>::LeftRightRotate(Node a)
{
a->left = LeftRotate(a->left);
return RightRotate(a);
}
template <typename Tk,typename Tv>
Node map<Tk,Tv>::RightLeftRotate(Node a)
{
a->right = RightRotate(a->right);
return LeftRotate(a);
}
template <typename Tk,typename Tv>
Node map<Tk,Tv>::Insert(Type<Tk,Tv> x, Node t)
{
if(t == NULL)
{
t = new node;
t->data=x;
t->height=1;
t->left=t->right=NULL;
return t;
}
else if(x.key < t->data.key)
t->left = Insert(x,t->left);
else
t->right = Insert(x,t->right);
t=Rotate(t);
t->height = Max(H(t->left), H(t->right)) + 1;
return t;
}
template <typename Tk,typename Tv>
Node map<Tk,Tv>::Rotate(Node T)
{
if(H(T->left) - H(T->right) == 2)
{
if(H(T->left->left) >= H(T->left->right))
T = RightRotate(T);
else
T = LeftRightRotate(T);
}
if(H(T->right) - H(T->left) == 2)
{
if(H(T->right->right) >= H(T->right->left))
T = LeftRotate(T);
else
T = RightLeftRotate(T);
}
return T;
}
template <typename Tk,typename Tv>
Node map<Tk,Tv>::Delete(Type<Tk,Tv> x, Node t)
{
if(t == NULL) return NULL;
if(t->data == x)
{
if(t->right == NULL)
{
Node temp = t;
t = t->left;
free(temp);
}
else
{
Node head = t->right;
while(head->left) head = head->left;
t->data = head->data;
t->right = Delete(t->data, t->right);
t->height = Max(H(t->left), H(t->right)) + 1;
}
return t;
}
else if(t->data < x)
Delete(x, t->right);
else
Delete(x, t->left);
if(t->left) t->left = Rotate(t->left);
if(t->right) t->right = Rotate(t->right);
t=Rotate(t);
return t;
}
int main()
{
int i,k,n;
while(scanf("%d",&n)!=EOF)
{
map <int ,int > temp;
for(i=1;i<=n;i++)
{
scanf("%d",&k);temp[i]=k;
temp.insert(makepair(i,k));
}
map <int ,int > t;
map <int, int > tt=t=temp;
for(i=1;i<=n;i++)
printf("%d\n",t[i]);
for(i=1;i<=n;i++)
printf("%d\n",tt[i]);
}
return 0;
}