问题描述

  欢迎来到暴走数据结构,我是洪尼玛。今天,我们来玩 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. javascript网页复制功能-复制到粘贴板-兼容多数浏览器(不使用flash)

    使用方法:clipBordCopy("hello Copy");//执行后复制hello Copy到粘贴板 通过 var result = clipBordCopy("h ...

  2. switch case 语法

    switch (条件){ case 第一种: 执行语句 break: case 第二种情况: 执行语句 break: default: 执行语句: break: }

  3. MySQL实战 | 06/07 简单说说MySQL中的锁

    原文链接:MySQL实战 | 06/07 简单说说MySQL中的锁 本文思维导图:https://mubu.com/doc/AOa-5t-IsG 锁是计算机协调多个进程或纯线程并发访问某一资源的机制. ...

  4. 1、在Eclipse中安装TestNG(离线方式)

    1.TestNG安装包:链接: https://pan.baidu.com/s/1UXZlJfrp8LM-6XmDLzVXKg 密码: 46y2 2.安装教程: (1).下载testNG 离线安装包[ ...

  5. hihoCoder#1067(离线算法求LCA)

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站,这个网站可以计算出某两个人的所有共同祖先中 ...

  6. 【转】LTE-NAS过程学习总结

    为了从网络得到非接入层服务,网络中非接入层节点必须知道有关UE的信息.为了这个目的,UE不得不发起附属过程,该过程是在UE开机和初始接入网络时必须被执行的. 一旦该过程成功,MME上就会建立好一个该U ...

  7. webscheduler 开源定时服务和延迟服务

    源码地址:https://gitee.com/eabeat/webscheduler 架构上采用 asp.net + access ,实现简单的管理界面,可以维护调用API,查看日志等功能.内核采用Q ...

  8. 初识python notes

    python数据类型 数字 字符串 列表 元祖 字典 1.为什么要编程 编程的目的是解放人力,这就需要人通过编写程序的方式计算机代替人去自动干活 2.什么是编程语言 编程语言就是人与计算机之间沟通的介 ...

  9. javascipt——对象的概念——数组

    一.Array 特点: 数组的长度是可变的: 数组的索引可以是数字.字符串: 数组的内容可以是任意内容: 可以通过索引获取之前不存在的一个位置,其值为undefined: 1.构造函数: new Ar ...

  10. 触摸事件MultiTouch Events

    备注: userInteractionEnabled = NO hidden = YES alpha = 0.0~0.01    //如果上面三个属性被设置了则无法接收触摸事件 1.- (void)t ...