红黑树(一)旋转
来源:互联网 发布:wamp配置域名 编辑:程序博客网 时间:2024/06/05 07:51
红黑树属于平衡二叉树,所以很多操作根二叉树是一样的。学习红黑树,首先要把二叉树理解,并能用代码实现。
我主要讲述我是怎么写一棵红黑树的,并不做过细的解释。我们主要学习旋转,插入,删除。其他操作根二叉树是一样的。
旋转跟插入操作,我是跟STL源码剖析学的,书上讲的很清楚,一个上午就可以理解+实现,然后下午学习删除操作,呵呵。。。删除操作书中没有介绍,我是对照算法导论里的伪代码跟在网上找的代码学的。不过有的博客里的源码有错误,建议大家先把他的代码粘下来,然后多运行两便,确定没问题后再跟他的代码学习。
接下来讲旋转操作,旋转操作就是变换元素位置,已达到平衡的目的。
左旋操作,这个并不难,基本理解过程就可以写出代码,要注意的是,如果1是根节点,转转之后把7设成根节点。
//左旋//1.将x的右孩子设为y的左孩子(如果y存在左孩子,将左孩子的父亲设为x)//2.将y的父亲设为x的父亲,将x的父亲的孩子设为y(根据x的情况,考虑左右孩子,是否是根节点)//3.将x的父亲设为y,将y的左孩子设为xstatic void left_rotate(Node * x, Tree * tree){ Node * y;//y是x的右孩子 y = x->right; x->right = y->left; if ( y->left != nil ) y->left->parent = x; y->parent = x->parent; if ( tree->root != x ) { if ( x == x->parent->left ) x->parent->left = y; else x->parent->right = y; } else tree->root = y; y->left = x; x->parent = y;}
大家可以根据自己的理解,实现代码。注意,左旋,旋转点一定要有左孩子。
右旋跟左旋操作一样,将left与right对换。这里不做介绍。
还有一种操作叫双旋,是通过左旋跟右旋来完成的。这里简单介绍一下。
第一步,以5为旋转点,左旋。
第二步,以10为旋转点,右旋。
0 0
- 红黑树(一)旋转
- 红黑树系列一:旋转
- 旋转变换(一)旋转矩阵
- 旋转变换(一)旋转矩阵
- 旋转变换(一)旋转矩阵
- 旋转变换(一)旋转矩阵
- 旋转变换(一)旋转矩阵
- 矩阵旋转运算(一)
- 算法之左旋转字符串(一)
- 非旋转 Treap 学习笔记(一)
- 一维数据旋转
- 关于“绕坐标轴的旋转”和“鼠标控制物体的旋转”(一)
- OpenCV学习笔记(一)——旋转向量与旋转矩阵相互转化
- 自底向上伸展树(之字形旋转+一字形旋转)
- OpenCV学习笔记(一)——旋转向量与旋转矩阵相互转化
- OpenCV学习笔记(一)——旋转向量与旋转矩阵相互转化
- Android 屏幕旋转(一):旋转设置
- HTML5 Canvas进阶(一):渐变,透明,移动,旋转,缩放
- qemu-img 命令介绍
- LOG4J打印mybatis问题
- ffmpeg 各个版本下载地址
- UVA548 二叉树
- 有趣的位运算
- 红黑树(一)旋转
- 《情感机器》-读书笔记摘要(4)
- GLSurfaceView
- Myeclipse+TestNG白盒测试环境搭建 虫师
- Vim插件之undotree
- Java使用JDBC连接MySQL数据库
- 如何在Eclipse中Debug调试Java jdk源代码
- 内核栈溢出保护
- Python爬虫入门 (一)