问题描述

  欢迎来到暴走数据结构,我是洪尼玛。今天,我们来玩 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的更多相关文章

  1. cb03a_c++_数据结构_顺序容器_STL_stack

    /*cb03a_c++_数据结构_顺序容器_STL_stack堆栈:LIFO--Last In First Out后进先出,用于系统程序设计自适应容器(容器适配器),不是独立的容器,是一个适配器栈适配 ...

  2. cb02a_c++_数据结构_顺序容器_STL_list类_双向链表

    /*cb02a_c++_数据结构_顺序容器_STL_list类_双向链表实例化std::list对象在list开头插入元素在list末尾插入元素在list中间插入元素,插入时间恒定,非常快.数组:中间 ...

  3. cb01a_c++_数据结构_顺序容器_STL_deque类

    /*cb01a_c++_数据结构_顺序容器_STL_deque类deque是一个动态数组,比vector更加灵活.两者都属于动态数组deque与vector非常类似deque可以在数组开头和末尾插入和 ...

  4. java数据结构_笔记(4)_图

    图一.概念.图: 是一种复杂的非线性数据结构.图的二元组定义: 图 G 由两个集合 V 和 E 组成,记为:G=(V, E)  其中: V 是顶点的有穷非空集合,E 是 V 中顶点偶对(称为边)的有穷 ...

  5. B-Tree外存数据结构 _(外存储器—磁盘)第一部分

    1.外存储器—磁盘 计算机存储设备一般分为两种:内存储器(main memory)和外存储器(external memory).内存存取速度快,但容量小,价格昂贵,而且不能长期保存数据(在不通电情况下 ...

  6. C#数据结构_基本概念及线性表

    常见的4类数据结构: 1.集合. 2.线性结构.3.树形结构.4.图状结构. 数据结构(Data Structure)简记为 DS,是一个二元组,DS = (D,R) 其中:D 是数据元素的有限集合, ...

  7. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_04 数据结构_1_数据结构_栈

    2.1 数据结构有什么用? 当你用着java里面的容器类很爽的时候,你有没有想过,怎么ArrayList就像一个无限扩充的数组,也好像链表之类 的.好用吗?好用,这就是数据结构的用处,只不过你在不知不 ...

  8. Python 数据结构_堆栈

    目录 目录 堆栈 堆栈 堆栈是一个后进先出(LIFO)的数据结构. 堆栈这个数据结构可以用于处理大部分具有后进先出的特性的程序流 . 在堆栈中, push 和 pop 是常用术语: push: 意思是 ...

  9. c_数据结构_图_邻接表

    课程设计------邻接表 图的遍历实现课程设计:https://files.cnblogs.com/files/Vera-y/图的遍历_课程设计.zip #include<stdio.h> ...

随机推荐

  1. [Unity3D]EZGUI 操作简单介绍

    官方的GUI根本无法跟EZGUI比,无论是资源还是易用性还是速度.EZGUI基于Mesh不占DrawCall.EZGUI是自动合并Mesh成为一个物体,并且贴图自动制作Atlas.所以效率高,CPU消 ...

  2. php操作EXCLE(通过phpExcle实现读excel数据)

    <?phprequire_once('/PHPExcel/Reader/Excel2007.php');$objReader = new PHPExcel_Reader_Excel2007;$P ...

  3. CAP理论、BASE理论

    从分布式一致性谈到CAP理论.BASE理论 https://www.cnblogs.com/szlbm/p/5588543.html 问题的提出 在计算机科学领域,分布式一致性是一个相当重要且被广泛探 ...

  4. Oracle job procedure 存储过程定时任务(转自hoojo)

    Oracle job procedure 存储过程定时任务 oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务. 一.查询系统中的job,可以查询视图 --相关视图 ...

  5. COGS 2259 异化多肽 —— 生成函数+多项式求逆

    题目:http://cogs.pro:8080/cogs/problem/problem.php?pid=2259 如果构造生成函数是许多个 \( (1+x^{k}+x^{2k}+...) \) 相乘 ...

  6. Python collections系列之默认字典

    默认字典(defaultdict)  defaultdict是对字典的类型的补充,它默认给字典的值设置了一个类型. 1.创建默认字典 import collections dic = collecti ...

  7. 静默安装Azure CLI

    Azure的CLI目前已经是基于Python的2.0版本.其信息在下面的链接可以找到: https://github.com/Azure/azure-cli 其安装方法可以根据网站上描述的命令实现: ...

  8. linux 将大文件分解为多个小文件

    使用的命令为: split --bytes 500M --numeric-suffixes --suffix-length=3 foo foo_ 其中 --bytes 为小文件的大小, --suffi ...

  9. [置顶] linux getline()函数

    getline()函数是什么?百度百科这样解释:      getline不是C库函数,而是C++库函数.它会生成一个包含一串从输入流读入的字符的字符串,直到以下情况发生会导致生成的此字符串结束.1) ...

  10. Ubuntu登录异常: 输入正确的密码, 但是却无法进入系统, 总是返回到登录界面, 但是用ctrl+alt+F1-F文字界面登录都可以进入。

    今天打开电脑的时候, 在输入密码之后, 未进入ubuntu的桌面, 而是显示了几行英文之后有返回到了登录界面.显示的英文如下: could not write bytes: Broken pipe   ...