一、目的

1.熟悉算法设计的基本思想
2.掌握构建红黑树的方法

二、内容与设计思想

  1. 编写随机整数生成算法,生成S到T范围内的N个随机整数并输出;
  2. 编写红黑树构建算法,中序遍历各节点,输出颜色和值;
  3. 随机生成1e2、1e3、1e4、1e5、1e6个不同的数,使用红黑树构建算法,并画图描述不同情况下的运行时间差异;

三、使用环境

推荐使用C/C++集成编译环境。

四、实验过程

1、写出红黑树构建算法的源代码

#include<bits/stdc++.h>
using namespace std;
#define RED 0
#define BLACK 1
#define MAXN 100000001int a[MAXN];typedef struct RBTreeNode
{char color;int key; struct RBTreeNode *lchild;struct RBTreeNode *rchild;struct RBTreeNode *parent;
}Node,*RBTree;typedef struct rb_root
{Node *node;
} RBRoot;RBRoot* creat_rbtree()
{RBRoot *root=(RBRoot*)malloc(sizeof(RBRoot));root->node=NULL; return root;
}Node*  creat_rbtree_node(int key,Node *parent,Node *lchild,Node *rchild)
{Node* p;p=(Node*)malloc(sizeof(Node));p->key=key;p->lchild=lchild;p->rchild=rchild;p->color=BLACK;return p;
}void rbtree_left_rotate(RBRoot *root,Node *x)
{Node *y=x->rchild;x->rchild=y->lchild;if (y->lchild!= NULL)y->lchild->parent = x;y->parent=x->parent;if(x->parent==NULL){root->node=y; }else{if(x->parent->lchild==x)  {x->parent->lchild=y;    }else{x->parent->rchild=y;}}y->lchild=x; x->parent=y;
}void rbtree_right_rotate(RBRoot *root,Node *y)
{Node *x=y->lchild;y->lchild=x->rchild;if(x->rchild!=NULL){x->rchild->parent=y;} x->parent=y->parent;if(y->parent==NULL){root->node=x;} else{if(y->parent->rchild==y) {y->parent->rchild=x;    }else{y->parent->lchild=x;}}x->rchild=y; y->parent=x;
}void rbtree_insert_fixup(RBRoot *root, Node *node)
{Node *parent, *gparent;while ((parent = node->parent) && (parent->color==RED)){gparent = parent->parent;if (parent == gparent->lchild){{Node *uncle = gparent->rchild;if (uncle && uncle->color==RED){uncle->color=BLACK;parent->color=BLACK;gparent->color=RED;node = gparent;continue;}}if (parent->rchild == node){Node *tmp;rbtree_left_rotate(root, parent); tmp = parent;parent = node;node = tmp;}parent->color=BLACK;gparent->color=RED;rbtree_right_rotate(root, gparent);} else{{Node *uncle = gparent->lchild;if (uncle && (uncle->color==RED)){uncle->color=BLACK;parent->color=BLACK;gparent->color=RED;node = gparent;continue;}}if (parent->lchild == node){Node *tmp;rbtree_right_rotate(root, parent);tmp = parent;parent = node;node = tmp;}parent->color=BLACK;gparent->color=RED;rbtree_left_rotate(root, gparent);}}root->node->color=BLACK;
}void rbtree_insert(RBRoot *root,Node *node)
{Node *y=NULL;Node *x=root->node;while(x!=NULL){y=x;if(x->key>node->key){x=x->lchild;}else{x=x->rchild;}}node->parent=y;if(y!=NULL){if(node->key<y->key){y->lchild=node;}else {y->rchild=node;}}else{root->node=node;}node->color=RED;rbtree_insert_fixup(root, node);} int insert_rbtree(RBRoot *root,int key)
{Node *node;node=creat_rbtree_node(key,NULL,NULL,NULL); if(node==NULL) return -1;else rbtree_insert(root,node);return 0;
}void inorder(RBTree tree)
{if(tree != NULL){inorder(tree->lchild);cout<<tree->key;if(tree->color==0){cout<<"(RED)"<<" ";}else {cout<<"(BLACK)"<<" ";}inorder(tree->rchild);}
}void inorder_rbtree(RBRoot *root)
{if (root)inorder(root->node);
}int main()
{int i,S,T,N;cin>>N>>S>>T;srand(time(0));for (i=0;i<N;i++){a[i]=rand()%(T-S)+S;}int key;RBRoot *root=NULL;root=creat_rbtree();for(i=0;i<N;i++){insert_rbtree(root,a[i]);} inorder_rbtree(root);return 0;
}

2、截取各个实验的实验结果
1e2 1e3 1e4 1e5 1e6 1e7
单位(ms) 0 0 2 53 2008 32826

算法导论06--红黑树构建算法相关推荐

  1. 算法导论 之 红黑树 - 添加[C语言]

    作者:邹奇峰 邮箱:Qifeng.zou.job@hotmail.com 博客:http://blog.csdn.net/qifengzou 日期:2013.12.24 21:00 转载请注明来自&q ...

  2. 《算法导论》红黑树详解(一):概念

    在学习红黑树之前,读者应先掌握二叉查找树的相关知识.学习红黑树或者二叉查找树,推荐大家看<算法导论>.<算法导论>原书第3版 高清PDF 带详细书签目录下载 密码:acis & ...

  3. 算法导论之红黑树的学习

    最近学习了二叉搜索树中的红黑树,感觉收获颇丰,在此写一篇文章小结一下学到的知识,顺便手写一下Java代码. 1.引言 先来讲讲什么是二叉搜索树,二叉搜索树有如下特点:他是以一颗二叉树(最多有两个子结点 ...

  4. 【算法导论06】递归算法-perm算法

    06递归算法-perm算法 问题描述: 给定一个含有n个数字的序列,设计算法对该序列进行全排列. 思路分析: 对n个数字序列进行全排列,最简单的思考方式是将n个数字依次作为序列的开头,得到n个n维序列 ...

  5. 【算法】红黑树-二叉树-算法

    红黑树-二叉树-算法 红黑树查找_百度搜索(5 条消息)AVL树,红黑树,B树,B+树,Trie树都分别应用在哪些现实场景中? - 知乎查找(二):彻底理解红黑树和平衡查找树 - @瞪着太阳的乌鸦 - ...

  6. 【数据结构和算法05】 红-黑树(转发)

    2019独角兽企业重金招聘Python工程师标准>>> [数据结构和算法05] 红-黑树(看完包懂~) 置顶 2016年04月13日 15:50:25 eson_15 阅读数:526 ...

  7. 算法学习二,红黑树查找算法

    二叉查找树,对于大多数情况下的查找和插入在效率上来说是没有问题的,但是他在最差的情况下效率比较低. 红黑树保证在最坏的情况下插入和查找效率都能保证在对数(Log(n))的时间复杂度内完成. 1.红黑树 ...

  8. 算法导论之图的基本算法

    图是一种数据结构,有关图的算法是计算机科学中基础性的算法.这个论述恰如其分. 图的基本算法包括图的表示方法和图的搜索方法.图的搜索技术是图算法领域的核心,有序地沿着图的边访问所有顶点,可以发现图的结构 ...

  9. 红黑树(算法导论版)

    1  定义 (1)每个节点是红色或者黑色的. (2)根节点是黑色的. (3)所有叶子结点(NIL)都是黑色的. (4)如果一个节点是红色,则它的两个子节点都是黑色的. (5)对每个节点,从该节点到其所 ...

最新文章

  1. Numpy入门教程:练习作业01
  2. 从零开始的webpack生活-0x003:html模板生成
  3. sql根据类别拆分上下级_运用SQL对黑五销售数据进行分析
  4. 在java中goto是意思,关于Java中的goto语句
  5. powerquery加载pdf_pdf转换为excel,你不会,同事点点鼠标2分钟就搞定了
  6. 最近点对问题(分治法)
  7. 向Docker容器中导入sql文件
  8. matlab在linux效率高吗,取代matlab, Linux下科学计算环境的搭建
  9. 我有几个粽子,和一个故事
  10. 写烂代码的人离职之后...
  11. word三线表最后一行加粗方式
  12. 友声条码秤对接软件_友声条码秤调试教程
  13. 【六袆 - Java】跟WebService说Hola;入门WebService;
  14. 电脑声卡或者耳机接口坏了怎么办
  15. 美国弗吉尼亚大学计算机科学,弗吉尼亚大学计算机科学专业
  16. 7月17日任务 10.23-27
  17. Mooc微信小程序学习笔记+作业经验分享
  18. 本地安装MySQL详细步骤
  19. opencv-车辆牌照识别(一)
  20. PC-DIMS测量中遇到了不可解决的问题

热门文章

  1. 微服务下的雪崩效应以及解决的方法
  2. 删除vlan 华为s5720_小白一个!向大神请教华为S5720S配置问题(已解决) - 网络管理论坛 - 51CTO技术论坛_中国领先的IT技术社区...
  3. 安全测试——利用Burpsuite密码爆破(Intruder入侵)
  4. GNU make 中文手册 第一二章 概述与介绍
  5. ITIL学习笔记——ITIL核心流程
  6. 数仓-oltp和olap
  7. 【嵌入式】STM32/μVision中的报错问题及解决办法
  8. 二元一次方程的求解java语言
  9. Java 数组定义和访问
  10. Cinema Director 教程——unity制作过程动画,剧情等