终于主动写了一次AVL树。。。果然还是有点晕
这是学习了别人的,照着改的
#include <iostream>
#include <stdio.h>
using namespace std;
struct Node
{
int value;
int height;
Node *left;
Node *right;
Node(int v, int h, Node *l, Node *r):value(v), height(h), left(l), right(r){}
};
typedef Node * Tree;
int height(Node *node)
{
if(node == NULL)
return -1;
else
return node->height;
}
void Lrotate(Tree &node)
{
Tree temp = node->left;
node->left = temp->right;
temp->right = node;
temp->height = max(height(temp->left), height(temp->right))+1;
node->height = max(height(node->right), height(node->left))+1;
node = temp;
}
void Rrotate(Tree &node)
{
Tree temp = node->right;
node->right = temp->left;
temp->left = node;
temp->height = max(height(temp->right), height(temp->left))+1;
node->height = max(height(node->right), height(node->left))+1;
node = temp;
}
void LRrotate(Tree &node)
{
Rrotate(node->left);
Lrotate(node);
}
void RLrotate(Tree &node)
{
Lrotate(node->right);
Rrotate(node);
}
void build(Tree &tree, int x)
{
if(tree == NULL)
{
tree = new Node(x, 0, NULL, NULL);
return;
}
if(x < tree->value)
{
build(tree->left, x);
if(height(tree->left) - height(tree->right) == 2)
{
if(x < tree->left->value)
Lrotate(tree);
else
LRrotate(tree);
}
}
else
{
build(tree->right, x);
if(height(tree->right) - height(tree->left) == 2)
{
if(x > tree->right->value)
Rrotate(tree);
else
RLrotate(tree);
}
}
tree->height = max(height(tree->left), height(tree->right))+1;
}
int main()
{
int n;
int x;
Tree tree = NULL;
cin >> n;
for(int i = 0; i < n; i++)
{
cin >> x;
build(tree,x);
}
cout << tree->value << endl;
return 0;
}