问题描述

  欢迎来到暴走数据结构,我是洪尼玛。今天,我们来玩 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. 利用HTML5开发Android笔记(上篇)

    资源来自于www.mhtml5.com 杨丰盛老师成都场的PPT分享 一个很简明的demo 可以作为入门基础 学习的过程中做了点笔记 整理如下 虽然内容比较简单 但是数量还是比较多的 所以分了3篇 ( ...

  2. web 压力测试工具ab压力测试详解

    Web性能压力测试工具之ApacheBench(ab)详解 原文:http://www.ha97.com/4617.html PS:网站性能压力测试是性能调优过程中必不可少的一环.只有让服务器处在高压 ...

  3. php 中改变字符编码的函数 是 iconv()

    json_enocode()  此函数里边接收的数据必须是utf8格式.要不然会输出null

  4. PHP学习创建水印,缩略图

    今天网上学习了一段PHP创建缩略图还有打水印的代码,如下: 其中将图片的路径作为参数传给函数,打水印的过程就是首先获取图片和logo的参数信息,然后将logo图片拷贝到原图的某个位置,然后保存,水印打 ...

  5. python 中zip函数的使用

    1.ta = [1,2,3] tb = [9,8,7] tc = ['a','b','c'] for (a,b,c) in zip(ta,tb,tc): print(a,b,c) 2. ta = [1 ...

  6. nginx 400

    做服务器nginx配置的时候有出现过 400 Bad Request  服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求.

  7. Python的交互模式和命令行模式

    Pyhton的交互模式 在终端输入Python3命令就会进入家Python的交互模式,在交互模式下,输入一行代码,回车,就会执行这行代码. Python的命令行模式 在终端输入Python3 1.py ...

  8. 在linux里建立一个快捷方式,连接到另一个目录

    ln -s 源目录 目标快捷方式比如要在/home/下面建立一个叫WIN7的快捷方式,指向/mnt/:ln -s /home/WIN7  /mnt

  9. 证书脚本--生成csr,key

    #!/bin/sh # this script can make certificate of each line in file you point which one! if [ $# -ne 1 ...

  10. [转]java 中的序列化是什么意思?有什么好处?

    1.序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态,并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存Object States,但是Java给你提供一种应该比 ...