nyoj 202 红黑树

红黑树

时间限制: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
时间: 2024-10-05 13:49:53

nyoj 202 红黑树的相关文章

NYOJ 220 (红黑树--模拟)

链接:click here 题意:题目其实很简单,绕一大圈,原来就是叫你输出输出中序遍历,Orz~~~红黑树经过旋转后中序遍历其实是不变的,所以与下面的旋转没有关系~~--- _ --. 思路:直接数组模拟,或用结构体:包含(数据域,左子树,右子树) 代码: #include <iostream> #include <stdio.h> #include <string.h> #include <vector> #include <algorithm&g

红黑树入门

红黑树 (参看<算法导论>) 红黑树是一种平衡二叉树,巧妙地利用结点颜色来简化维护平衡的难度.具有如下性质: 1.红黑树上所有结点要么是红色的,要么是黑色的. 2.红黑树的根节点是黑色的. 3.如果一个结点是红色的,那么他的两个子结点必须是黑色的. 4.对于每一个结点,他左子树的黑色结点数量必然等于右子树的黑色结点数量. 5.所有叶子结点必然是黑色的. (一)抛弃原有的NULL,所有指向NULL的指针,改为指向一个与普通结点相同的T.null结点,T.null结点颜色固定为黑色,这样便解决了叶

数据结构之红黑树

红黑树(Red Black Tree) 是一种自平衡二叉查找树 红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能.它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目.(度娘)C++ stl里面的set,map底层就是用红黑树实现的.红黑树具体的插入删除原理请参考<<算法导论>> 维基上面也讲得不错.反正插入过程就是要解决&q

红黑树的插入操作

1 package Tree; 2 3 import org.junit.Test; 4 5 class RedBlackTreeNode { 6 7 int key = 0; 8 RedBlackTreeNode left = null; 9 RedBlackTreeNode right = null; 10 RedBlackTreeNode parent = null; 11 // 色域,0表示黑色,1表示红色 12 int color; 13 14 public RedBlackTreeN

深入理解红黑树

红黑树是平衡树的一种,保证最坏情况下操作时间复杂度为O(lgo(n)).红黑树的应用比较广泛,比如作为C++中STL的set和map的底层数据结构,Java集合中TreeSet和TreeMap的底层数据结构等.学习红黑树,可以把二叉查找树作为参考,这样有助于加深理解.红黑树的操作主要包括节点旋转.插入.删除等操作,下面咱们就一一来看: 1.红黑树性质 每个节点是红色的,或者是黑色的 根节点是黑色的 每个叶节点(nil)是黑色的 如果一个节点是红色的,则它的两个子节点都是黑色的 对每个节点,从该节

数据结构--树--红黑树

R-B Tree简介 R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树.红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black). 红黑树的特性:(1)每个节点或者是黑色,或者是红色.(2)根节点是黑色.(3)每个叶子节点(NIL)是黑色. [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!](4)如果一个节点是红色的,则它的子节点必须是黑色的.(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点.

红黑树并没有我们想象的那么难(下)

SGI STL map 实现概述 根据上一节的红黑树分析, 结合 sgi stl map 的实现, 看看红黑树的源码是如何实现的. 以下主要以代码的注释为主. sgi stl map 底层实现是 _Rb_tree类, 为了方便管理, _Rb_tree 内置了 _M_header, 用于记录红黑树中的根节点, 最小节点和最大节点. 在插入删除中都会对其进行维护. 找到一副美艳的图片: 我只会展开插入和删除的代码. _Rb_tree 有 insert_unique() 和 insert_equal(

红黑树(RBTREE)之上-------构造红黑树

该怎么说呢,现在写代码的速度还是很快的,很高兴,o(^▽^)o. 光棍节到了,早上没忍住,手贱了一般,看到*D的优惠,买了个机械键盘,晚上就到了,敲着还是很舒服的,和老婆炫耀了一把哈哈. 光棍节再去*mall买个,带着上班用. 正题,构造红黑树,就是节点的插入与调整,具体的理论我就不说了,图我也不画了,别人画的很好,我在纸上画的我自己都不想看.   贴几个网址作为参考吧: 参考的文档:1.http://www.cnblogs.com/zhb-php/p/5504481.html (推荐) 2.h

算法导论第十三章 红黑树

写在前面:这一章真的把我害惨了,之前至少尝试看过3遍,每次看之前都下定决定一定要把它拿下,可是由于内容较多,深度够深,以致于每次要不是中途有什么事放弃了就跳过了,要不是花时间太多仍然不能理解而放弃.这次总算挺过来了,前后零零散散的时间加起来差不多也有两天时间.这次能坚持下来并攻克,我想大概有这么几个原因吧:第一是之前下定的决心要写一个最新版<算法导论>的读书笔记,之前几章都坚持写了,不能让这个成为拦路虎,即使再难再花时间都要弄懂:第二是通过前面几章的动手实践,发现自己的理解能力.动手能力都进步