您的位置:首页 > 其它

1066. Root of AVL Tree

2016-06-27 10:47 381 查看
终于主动写了一次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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: