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;
}
这是学习了别人的,照着改的
#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;
}
相关文章推荐
- java WEB 配置文件的读取
- 沟通的艺术——情绪:感觉、思考和沟通
- HTML5 canvas基本绘图之图形组合
- 文档发布工具mkdocs
- iOS面试题之runloop
- Java web复习要点
- Unity3d简单的资源管理器
- 剑指offer题解 数字在排序数组中出现的次数
- Android设计模式笔记-单例模式、策略模式
- Apache Thrift - 可伸缩的跨语言服务开发框架
- cookie、 sessionStorage 、localStorage之间的区别和使用
- 程序员编程的8条小贴士
- oracle的常规操作(基本命令)
- 敌机飞机的添加
- Nginx反向代理关于端口的问题
- sublime text 2 JS 代码提示和代码格式化format
- root用户无法登录
- iOS 使用Https访问网络(一)
- Six Degrees of Cowvin Bacon poj 2131(floyd)
- HTML5不支持标签和新增标签详解