数据结构_我不会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> ...
随机推荐
- Inception-Resnet-V2
零.Inception-Resnet-V2的网络模型 整体结构如下,整体设计简洁直观: 其中的stem部分网络结构如下,inception设计,并且conv也使用了7*1+1*7这种优化形式: inc ...
- [转]angular之$apply()方法
这几天,根据buddy指定的任务,要分享一点angular JS的东西.对于一个在前端属于纯新手的我来说,Javascript都还是一知半解,要想直接上手angular JS,遇到的阻力还真是不少.不 ...
- flask+blueprint路由配置
1.flask默认的静态文件和html文件在app应用文件夹里的相应文件夹下:app // Flask||--static ||--templates |静态文件默认的url地址为:url_prefi ...
- MongoDB优化之一:常见优化方法
常用性能优化方案 创建索引 限定返回结果数 只查询使用到的字段 采用capped collection 采用Server Side Code Execution 使用Hint,强制使用索引 Hint ...
- 【转】前端上传组件Plupload使用指南
http://www.cnblogs.com/2050/p/3913184.html Plupload有以下功能和特点: 1.拥有多种上传方式:HTML5.flash.silverlight以及传统的 ...
- C Primer Plus学习笔记(五)- C控制语句:循环
伪代码的概念: 伪代码是一种用简单的句子表示程序思路的方法,它与计算机语言的形式相对应.伪代码有助于设计程序的逻辑.确定程序的逻辑无误之后,再把伪代码翻译成实际的编程代码.使用伪代码的好处之一是,可以 ...
- C Primer Plus学习笔记(二)- 数据和C
从一个简单的程序开始 #include <stdio.h> int main(void) { float weight; float value; printf("Please ...
- 重新认识synchronized(上)
synchronized在JDK5之前一直被称为重量级锁,是一个较为鸡肋的设计,而在JDK6对synchronized内在机制进行了大量显著的优化,加入了CAS,轻量级锁和偏向锁的功能,性能上已经跟R ...
- debian7 安装VMware Tools
前提:需要安装gcc.kernel 1. apt-get install gcc 2. apt-get install kernel 问题描述: 安装时如果提示更换介质 :请把标有 " de ...
- IIS安装与部署,站点的部署与配置
第一章:IIS安装与部署 一,服务器概念的理解: 将设计好的软件只要部署到一台机器(服务器--->IIS)上,其它的员工通过浏览器(网址.)来进行访问. 做好的网站必须部署到这台机器上的IIS中 ...