NYOJ 202

简介:   红黑树 时间限制:3000 ms | 内存限制:65535 KB 难度:3   描述 什么是红黑树呢?顾名思义,跟枣树类似,红黑树是一种叶子是黑色果子是红色的树。。。 当然,这个是我说的。

 

红黑树

时间限制: 3000 ms | 内存限制: 65535 KB
难度: 3
 
描述

什么是红黑树呢?顾名思义,跟枣树类似,红黑树是一种叶子是黑色果子是红色的树。。。

当然,这个是我说的。。。

《算法导论》上可不是这么说的:

如果一个二叉查找树满足下面的红黑性质,那么则为一个红黑树。

1)每个节点或是红的,或者是黑的。

2)每个叶子节点(NIL)是黑色的

3)如果一个节点是红色的,那么他的两个儿子都是黑的。

4)根节点是黑色的。

5)对于每个节点,从该节点到子孙节点的所有路径上包含相同数目的黑色节点。

我们在整个过程中会用到这些性质,当然,为了公平起见,其实即使你不知道这些性质,这个题目也是可以完成的(为什么不早说。。。。)。在红黑树的各种操作中,其核心操作被称为旋转,那么什么是旋转呢,我们来看一个例子:

假设我们这里截取红黑树的一部分,放在左边,通过操作如果可以把他转化为右边的形式,那么我们就称将根为x的子树进行了左旋,反之我们称将根为Y的树进行了右旋:

恰好慢板同学把自己红黑树弄乱了,然后请你帮忙进行修复,他将向你描述他的红黑树(混乱的。。。)。然后告诉他需要用哪种方式旋转某个节点。在你完成工作之后,直接向大黄提交新的树的中序遍历结果就好了。

 

Hint:

在这里好心的慢板同学给你简单的解释下样例:

最开始的时候树的样子是这样的:

0

/ \

1 2

然后对于标号为0的节点进行右旋,结果将变为:

1

\

0

\

2

然后呢。。。

中序遍历?这个是什么东西,哪个人可以告诉我下。。。。

 
输入
输入分两部分:
第一部分:一个整数T(1<=T<=10),表示测试的组数。
第二部分:第一行是一个数字N,表示红黑树的节点个数。0<N<10
然后下面有N行,每行三个数字,每个数字的大小都在-1~N-1之间。第一个数字表示当前节点的标号,后面两个数字表示这个节点的左孩子和右孩子。如果是-1的话表示是空节点。对于所有的输入来说标号为0节点为根。
然后是一个数字M表示需要旋转的次数。M<100
接下来M行,每行有两个数字,分别表示你要旋转的节点标号和你需要的操作。标号的范围为0~n-1,如果标号后面的数字0,那么表示为左旋。如果是1,则表示右旋。
输出
每组测试返回N行数字,表示对树的中序遍历。在每组测试数据之后留一行空行。
样例输入
1
3
0 1 2
1 -1 -1
2 -1 -1
1
0 1
样例输出
1
0
2
 1 #include<stdio.h>
 2 struct Node//加上typedef后,老编译错误 
 3 {
 4     int data;
 5     int lchild,rchild;
 6 }tree[11];
 7 void print1(int key)
 8 {
 9      if(key!=-1)
10      {
11           print1(tree[key].lchild);
12           printf("%d\n",tree[key].data);
13           print1(tree[key].rchild);
14      }
15 }
16 int main()
17 {
18     int i,j,k,T;
19      int root,ld,rd,num,m;
20     scanf("%d",&T);
21     while(T--)
22     {
23         scanf("%d",&num);
24         for(i=0;i<num;i++)
25         {
26             scanf("%d%d%d",&root,&ld,&rd);
27             tree[root].data=root;
28             tree[root].lchild=ld;
29             tree[root].rchild=rd;
30         }
31         scanf("%d",&m);
32         while(m--)
33             scanf("%*d%*d");
34         print1(0);//0表示根节点 
35         putchar('\n');
36     }
37     return 0;
38 }         

 

目录
相关文章
|
9月前
|
监控 Linux 数据处理
探索Linux中的`mountpoint`命令
`mountpoint`命令在Linux中用于检测目录是否为挂载点,关键在于检查`/etc/mtab`或`/proc/mounts`。简单易用,高效且无额外依赖。例如,用`mountpoint -q /mnt/data`判断挂载点,并结合`find`列出所有挂载点。在脚本中注意检查返回值,可能需`sudo`提升权限。可与其他命令组合以扩展功能。
127 10
|
存储 网络协议 数据库
Windows 08 R2_创建AD DS域服务(图文详解)
目录 目录 Active Directory概念 创建第一个AD域控制器 搭建DNS服务器 使用Windows窗口程序创建AD域控制器 AD与LDAP的关系 使用Powershell来创建ADDS域控制器 检查ADDC域控制器是否安装成功 管理工具 创建额外域控制器 使用Windows窗口界面来安装额外域控制器 使用Powershell脚本来安装额外域控制器 Active Directory概念 AD(活动目录):是一种组织资源信息的方法,目录的意义在于我们可以通过标题或者说搜索条件来简单而有效率的在大量数据中查找匹配的信息。
4001 0
|
9月前
|
机器学习/深度学习 人工智能 自然语言处理
AI大模型学习
AI大模型学习
135 0
|
前端开发 API
前端时间处理库-Day.js与Moment.js
偶然遇到一些需求,需要计算时间差或者处理时间,格式化,转换等等。 那大名鼎鼎的两个时间库不多说了,在标题,非常强大。
1080 0
|
测试技术 数据处理 数据库
Android Modbus 通讯实现
Android Modbus 通讯实现
541 0
Android Modbus 通讯实现
|
9月前
|
自然语言处理 并行计算 测试技术
初次体验魔搭,问题一堆堆
问题不少,可以提升的空间还很大
|
弹性计算 运维 数据可视化
【ECS生长万物之开源】使用计算巢发布大模型的零代码微调服务
【ECS生长万物之开源】使用计算巢发布大模型的零代码微调服务
《逻辑与计算机设计基础(原书第5版)》——2.6 异或操作和异或门
本节书摘来自华章计算机《逻辑与计算机设计基础(原书第5版)》一书中的第2章,第2.6节,作者:(美)M.莫里斯·马诺(M. Morris Mano)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1732 0
|
存储
寄存器介绍
一、寄存器的定义 寄存器是计算机中的一种存储设备,用于暂时存储指令和数据。它位于计算机的中央处理器(CPU)内部,是最快速的存储器之一。寄存器的容量较小,但速度非常快,能够快速读取和写入数据。 二、寄存器的功能 数据存储:寄存器可以暂时存储指令和数据,供CPU进行读取和处理。 数据传输:寄存器可以在CPU内部传输数据,实现不同部件之间的数据交换。 运算操作:寄存器可以进行基本的算术和逻辑运算,支持CPU的运算功能。 地址定位:寄存器可以存储指令和数据的地址信息,帮助CPU准确定位数据的位置。 三、寄存器的类型 通用寄存器:通用寄存器用于存储临时数据,供CPU进行运算操作。 累加寄存器:累
396 0
|
9月前
|
5G 网络架构
已解决:树莓派外接硬盘 usb 或者sata 导致wifi无法链接 无线网卡无法使用问题
已解决:树莓派外接硬盘 usb 或者sata 导致wifi无法链接 无线网卡无法使用问题
176 4

热门文章

最新文章