#include <stdio
.h
>
#include<stdlib
.h
>
typedef struct AvlNode
* AvlTree;
struct AvlNode
{
int
data;
AvlTree left;
AvlTree right;
int height;
};
int
Max(int a, int b)
{
int i
= (a
> b
? a : b);
return i;
}
int height(AvlTree Tree)
{
if (
!Tree)
return -1;
else
return Tree
->height;
}
AvlTree singleRotateWithLeft(AvlTree K1)
{
AvlTree K2
= K1
->left;
K1
->left
=K2
->right;
K2
->right
= K1;
K1
->height
= Max(height(K1
->left), height(K1
->right))
+1;
K2
->height
= Max(height(K2
->left), height(K1))
+1;
return K2;
}
AvlTree singleRotateWithRight(AvlTree K1)
{
AvlTree K2
= K1
->right;
K1
->right
= K2
->left;
K2
->left
= K1;
K1
->height
=Max(height(K1
->left), height(K1
->right))
+1;
K2
->height
= Max(height(K1), height(K2
->right))
+1;
return K2;
}
AvlTree doubleRotateWithLeft(AvlTree K1)
{
K1
->left
= singleRotateWithRight(K1
->left);
return singleRotateWithLeft(K1);
}
AvlTree doubleRotateWithRight(AvlTree K1)
{
K1
->right
= singleRotateWithLeft(K1
->right);
return singleRotateWithRight(K1);
}
AvlTree Insert(int x, AvlTree Tree)
{
if (Tree
== NULL)
{
Tree
= (AvlTree)malloc(sizeof(struct AvlNode));
Tree
->data = x;
Tree
->left
= NULL;
Tree
->right
= NULL;
Tree
->height
= 0;
}
else
{
if (x
< Tree
->data)
{
Tree
->left
=Insert(x, Tree
->left);
if (height(Tree
->left)
- height(Tree
->right)
== 2)
{
if (x
< Tree
->left
->data)
Tree
= singleRotateWithLeft(Tree);
else if (x
> Tree
->left
->data)
Tree
= doubleRotateWithLeft(Tree);
}
}
else if (x
> Tree
->data)
{
Tree
->right
= Insert(x, Tree
->right);
if (height(Tree
->right)
- height(Tree
->left)
== 2)
{
if (x
> Tree
->right
->data)
Tree
= singleRotateWithRight(Tree);
else if(x
<Tree
->right
->data)
Tree
= doubleRotateWithRight(Tree);
}
}
}
Tree
->height
= Max(height(Tree
->left), height(Tree
->right))
+ 1;
return Tree;
}
int main(
void)
{
int N;
int x;
scanf(
"%d",
&N);
AvlTree Tree;
Tree
= NULL;
for (int i
= 0; i
< N; i
++)
{
if (scanf(
"%d",
&x)
== 1)
Tree
= Insert(x, Tree);
}
printf(
"%d",Tree
->data);
}
转载请注明原文地址: https://ju.6miu.com/read-968874.html