数据结构_我不会AVL_wbhavl
问题描述
欢迎来到暴走数据结构,我是洪尼玛。今天,我们来玩 AVL 树,怎么玩呢? 很简单:给
你 n 个数字,你需要按顺序插入一棵 AVL树中,然后输出每个数所在节点的深度(从 1 开始)。
因为我不会 AVL 树,所以希望聪明的你们来帮我完成这个任务
★数据输入
输入第一个数为 n(n≤100000) 表示数字的个数
接下来一行输入 n 个数,范围在 1 到 n 之间,每个数只出现一次
★数据输出
按输入的顺序依次输出每个数所在节点的深度
输入示例 | 输出示例 |
6 1 2 3 4 5 6 |
3 2 3 1 2 3 |
★提示
注意: 输出行末不能有空格
对于 50%的数据, 1<=n<=100
对于 100%的数据, 1<=n<=100000
思路
没说明技巧,就是avl树
具体实现自行百度
code
#include <stdio.h>
#include <stdlib.h>
#include <string.h> struct Node
{
int data;
int height;
int left;
int right;
}; Node *arr = NULL; inline int Max(int a,int b) {return a>b?a:b;}
inline int GetHeight(int root){
return arr[root].height; //return root==0 ? 0 : arr[root]->height;
}
inline void CalcHeight(int root){
arr[root].height = Max(GetHeight(arr[root].left),GetHeight(arr[root].right)) + ;
}
//------------------------------------------------------------------------------------
int RightRotate(int root)
{
int newroot = arr[root].left;
arr[root].left = arr[newroot].right;
arr[newroot].right = root;
CalcHeight(root);
CalcHeight(newroot);
return newroot;
}
int LeftRotate(int root)
{
int newroot = arr[root].right;
arr[root].right = arr[newroot].left;
arr[newroot].left = root;
CalcHeight(root);
CalcHeight(newroot);
return newroot;
}
int LeftRightRotate(int root)
{
arr[root].left = LeftRotate(arr[root].left);
return RightRotate(root);
}
int RightLeftRotate(int root)
{
arr[root].right = RightRotate(arr[root].right);
return LeftRotate(root);
}
//------------------------------------------------------------------------------------
int Insert(int root, int data)
{
if(root==)
{
arr[data].data = data;
arr[data].height = ;
return data;
}
else if(data < arr[root].data)
{
arr[root].left = Insert(arr[root].left,data);
if(GetHeight(arr[root].left) - GetHeight(arr[root].right) >= )
{
if(data < arr[arr[root].left].data)
root = RightRotate(root);
else//if(data > arr[arr[root]->left]->data)
root = LeftRightRotate(root);
}
}
else if(data > arr[root].data)
{
arr[root].right = Insert(arr[root].right,data);
if(GetHeight(arr[root].right) - GetHeight(arr[root].left) >= )
{
if(data > arr[arr[root].right].data)
root = LeftRotate(root);
else//if(data < arr[arr[root]->right]->data)
root = RightLeftRotate(root);
}
}//else ==
CalcHeight(root);
return root;
} void dfs(int index,int step)
{
if(index==) return;
arr[index].height = step;
dfs(arr[index].left,step+);
dfs(arr[index].right,step+);
} int main()
{
int n;
scanf("%d",&n);
int *data = (int *)malloc(sizeof(int)*(n+));
arr = (Node *)malloc(sizeof(Node)*(n+));
memset(arr,,sizeof(Node)*(n+));
//------------------------------------------------
int root = ;
int i;
for(i=; i<n; i++)
{
scanf("%d",data+i);
root = Insert(root,data[i]);
}
dfs(root,);
for(i=; i<n; i++)
{
if(i==n-)
printf("%d\n",arr[data[i]].height);
else
printf("%d ",arr[data[i]].height);
} //------------------------------------------------
free(arr);
free(data);
return ;
}
数据结构_我不会AVL_wbhavl的更多相关文章
- cb03a_c++_数据结构_顺序容器_STL_stack
/*cb03a_c++_数据结构_顺序容器_STL_stack堆栈:LIFO--Last In First Out后进先出,用于系统程序设计自适应容器(容器适配器),不是独立的容器,是一个适配器栈适配 ...
- cb02a_c++_数据结构_顺序容器_STL_list类_双向链表
/*cb02a_c++_数据结构_顺序容器_STL_list类_双向链表实例化std::list对象在list开头插入元素在list末尾插入元素在list中间插入元素,插入时间恒定,非常快.数组:中间 ...
- cb01a_c++_数据结构_顺序容器_STL_deque类
/*cb01a_c++_数据结构_顺序容器_STL_deque类deque是一个动态数组,比vector更加灵活.两者都属于动态数组deque与vector非常类似deque可以在数组开头和末尾插入和 ...
- java数据结构_笔记(4)_图
图一.概念.图: 是一种复杂的非线性数据结构.图的二元组定义: 图 G 由两个集合 V 和 E 组成,记为:G=(V, E) 其中: V 是顶点的有穷非空集合,E 是 V 中顶点偶对(称为边)的有穷 ...
- B-Tree外存数据结构 _(外存储器—磁盘)第一部分
1.外存储器—磁盘 计算机存储设备一般分为两种:内存储器(main memory)和外存储器(external memory).内存存取速度快,但容量小,价格昂贵,而且不能长期保存数据(在不通电情况下 ...
- C#数据结构_基本概念及线性表
常见的4类数据结构: 1.集合. 2.线性结构.3.树形结构.4.图状结构. 数据结构(Data Structure)简记为 DS,是一个二元组,DS = (D,R) 其中:D 是数据元素的有限集合, ...
- 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_04 数据结构_1_数据结构_栈
2.1 数据结构有什么用? 当你用着java里面的容器类很爽的时候,你有没有想过,怎么ArrayList就像一个无限扩充的数组,也好像链表之类 的.好用吗?好用,这就是数据结构的用处,只不过你在不知不 ...
- Python 数据结构_堆栈
目录 目录 堆栈 堆栈 堆栈是一个后进先出(LIFO)的数据结构. 堆栈这个数据结构可以用于处理大部分具有后进先出的特性的程序流 . 在堆栈中, push 和 pop 是常用术语: push: 意思是 ...
- c_数据结构_图_邻接表
课程设计------邻接表 图的遍历实现课程设计:https://files.cnblogs.com/files/Vera-y/图的遍历_课程设计.zip #include<stdio.h> ...
随机推荐
- CodeForces - 896D :Nephren Runs a Cinema(卡特兰数&组合数学---比较综合的一道题)
Lakhesh loves to make movies, so Nephren helps her run a cinema. We may call it No. 68 Cinema. Howev ...
- 设置nodepad++的编码问题
- Maven里头的pom.xml配置详解
正常的pom配置文件如下所示: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http ...
- 关于打包后提示无法连接到mongodb的情况
昨天晚上要和前端联调. 打完jar包后发现无法连接到测试环境的数据库. 就很尴尬,最后发现问题在于mongodb的URI写错了: 正确的URI格式:mongodb://url:port/dbName ...
- 应用层-day01
主流应用程序体系结构:CS结构.P2P结构. CS结构:客户-服务器体系结构.有一台总是打开的主机称为服务器,它服务来自其他许多称为客户的主机的请求. P2P体系结构:应用程序在不同的主机间链接,被称 ...
- Java编程思想第七章复用类
7.1组合语法 在一个类中引入多个对象,以提高代码的复用性与功能. 7.2继承语法 使用继承子类可以获得,导出类可以获得基类的成员(变量与方法). 注:这里注意权限控制,若基类中的成员为默认权限,只有 ...
- TCP之半关闭与CLOSE_WAIT
终止一个连接要经过4次握手.这由TCP的半关闭(half-close)造成的.既然一个TCP连接是全双工(即数据在两个方向上能同时传递,可理解为两个方向相反的独立通道),因此每个方向必须单独地进行关闭 ...
- Python:函数变量的使用
1.上层函数不能直接使用其嵌套函数的变量: def func1(x, y): z = x + y def func2(): m = 3 z += m return z print(func1(1, 2 ...
- 数据库:ubantu下MySQL数据库备份方法
1.编辑/etc/crontab文件设定定时任务,在制定时间执行backup_databases.sh vi /etc/crontab # /etc/crontab: system-wide cron ...
- Android SDK下载项的说明
Tools下 1.android sdk tools 软件开发工具包(software development kit):包括测试.调试.第三方工具.模拟器.数据管理工具等. 2.android sd ...