`

一些基于二分查找树的简单操作

阅读更多

1.获得给定小于给定key中的最大值,如果包含给定key,则返回该key;

        不谈找到指定key,这个问题就是寻找如果将给定key插入到树中,其后趋。如果是获得大于key中的最小值,则是寻找将该值插入到树中的前趋。

        2分查找树中的中序遍历就是按升序排列的数列。

K floorKey(K key){
    160         K p = root;
    161         while(p!=null){
    162                 if(key>p){
    163                         if(p.right!=null){
    164                                 p = p.right;
    165                         } else {
    166                                 return p;
    167                         }
    168                 } else {
    169                         if(p.left!=null){
    170                                 p = p.left;
    171                         } else {
    172                                 K parent = p.parent;
    173                                 K ch = p;
    174                                 while(parent!=null&&ch == parent.left){
    175                                         ch = parent;
    176                                         parent = parent.parent;
    177                                 }
    178                                 return parent;
                                    }
                            } 

 

2.红黑树的插入算法实现;

两点,显式的是插入节点设置为红色会破坏红黑树的颜色规则,隐式的是插入节点导致的颜色调整会破坏红黑树的平衡性,即通过旋转而破坏最大黑长度大于(2lnh-1);

 

//红黑树的插入
void insert(K key){
	K p = root;	
	while(p!=null){
		if(key<p){
			p = p.left;
		} else if(key>p) {
			p = p.right;
		}
	}
	p = key;
	p.color = red;
	fixAfterInsert(p);
}

void fixAfterInsert(K p){
	K parent = p.parent;
	while(parent!=null&&parent.color == red){
		if(parent == parent.parent.left){
			K uncle = parent.parent.right;
			if(uncle.color == red){
				parent.color = black;
				uncle.color = black;
				parent.parent.color = red;
				p = parent.parent;
			} else {
				if(p == parent.right){
					p = parent;
					leftrotate(p);
				}
				p.parent = black;
				p.parent.parent = red;
				rightrotate(p.parent.parent);
			}
		} else {
			K Uncle = p.parent.parent.left;
			if(uncle.color = red){
				parent.color = black;
				uncle.color = black;
				parent.parent.color = red;
				p = parent.parent;
			} else {
				if(p = parent.left){
					p = parent;
					rightrotate(p);
				}
				p.parent = black;
				p.parent.parent = red;
				leftrotate(p.parent.parent);
			}
		}
	}
	root.color = black;
}

 3.红黑树的删除实现;

 

依旧是那条原则,基于数据结构的操作不能违背数据结构的定义。所以,红黑树的删除可能导致的问题第一是将一个红色节点作为根,或者删除节点的父节点和子节点都是红色,还有最最重要的是删除的黑色节点会影响到从删除节点到其余叶子的路径上黑色节点的数量减少(如果是删除了红色节点,对其不影响)。

1.如果将一红色节点设置为根,那么只要设置其为黑色,从根到所有叶子节点的黑高度减1;

2.红红,红黑节点相连接,也很简单,设置其为黑色;

3.这个就复杂了,删除节点的子节点为黑色(如果为根就是case1),那么,通过对其父节点和兄弟节点颜色的设置,再进行旋转,就可到达要求(为什么需要对兄弟节点考虑不同情况,旋转嘛,固然和该sib有关啦):

                1.兄弟节点(sib)为红色,其父节点为黑色,删除节点后导致替换该位置的子树比兄弟子树黑高度少,那么父节点设置为红色,sib为黑,旋转即可。

                2.sib为黑色并且两个子节点都为黑色,动动脑子也知道对sib设置红色,那么从该两节点(sib和该节点)的父节点的子树黑高度都减少了1,那么将该父节点开始递归操作,直到某节点是红色或者为根。

                3.sib为黑色节点而右孩子为黑色,左节点为红色,转换该左孩子和sib颜色,然后对sib旋转,现在的情况是sib为红色,原左孩子为黑色,新sib是它。

                4.其实case3是为了转换为case4,sib的右节点为红色的情况,现在sib节点子树黑高度大于删除节点的子树,我开始的想法是直接旋转,发现旋转后原sib节点的父节点的孩子的子树上黑高度太“高”了,所以,将父节点设置为黑色,而sib设置为红色。

 

代码的话,treemap里面第2100行左右有,呵呵,懒,不愿意cp了。

 

 

 

最后,我的文章都是写给自己看的,所以,很多地方很懒,自己懂就好了。

分享到:
评论

相关推荐

    计算机二级公共基础知识

    顺序查找法每一次比较,只将查找范围减少1,而二分法查找,每比较一次,可将查找范围减少为原来的一半,效率大大提高。 对于长度为n的有序线性表,在最坏情况下,二分法查找只需比较log2n次, 二级公共...

    数据挖掘18大算法实现以及其他相关经典DM算法

    主要用于关键信息的搜索,类似于在空间中的二分搜索,大大提高了搜索效率,在寻找目标元素时,使用了DFS深度优先的方式和回溯进行最近点的寻找。详细介绍链接 MS-Apriori 基于多支持度的Apriori算法。是Apriori...

    java源码包2

    1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    *3.4.1 输入流与输出流的基本操作 *3.4.2 在输入流与输出流中使用控制符 3.4.3 用getchar和putchar函数进行字符的输入和输出 3.4.4 用scanf和printf函数进行输入和输出 3.5 编写顺序结构的程序 3.6 关系运算和逻辑...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    *3.4.1 输入流与输出流的基本操作 *3.4.2 在输入流与输出流中使用控制符 3.4.3 用getchar和putchar函数进行字符的输入和输出 3.4.4 用scanf和printf函数进行输入和输出 3.5 编写顺序结构的程序 3.6 关系运算和逻辑...

    数据结构(C++)有关练习题

    内容及步骤: 编写一个类Complex,定义复数的加法、减法、乘法和除法运算,要求在编写该类时重载这些运算操作符,并重载I/O操作符,以便输入和输出复数; 实验报告要求: 按要求写出完整的实验代码; ...

    精通Qt4编程(第二版)源代码

    \8.2 操作二进制文件 220 \8.3 临时文件 222 \8.4 目录操作和文件管理 222 \8.4.1 目录操作 222 \8.4.2 文件管理 224 \8.5 监视文件系统变化 225 \8.6 文件引擎 226 \8.7 小结 226 \第9章 网络 227 \9.1 ...

    代码之美(中文完整版).pdf

    7.3将二分查找进行到底 7.4 结论 第8章 图像处理中的即时代码生成 第9章 自顶向下的运算符优先级 9.1. JavaScript 9.2. 符号表 9.3. 语素 9.4. 优先级 9.5. 表达式 9.6. 中置运算符 9.7. 前置操作符 9.8. 赋值运算符...

    《妙趣横生的算法(C语言实现)》(杨峰 编著)

    也可作为具有一定经验的程序设计人员巩固和提高编程水平,查阅相关算法实现和数据结构知识的参考资料,同时也为那些准备参加与算法和数据结构相关的面试的读者提供一些有益的帮助。最大的特色在于实例丰富,题材新颖...

    vc++ 应用源码包_1

    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...

    vc++ 应用源码包_2

    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...

    vc++ 应用源码包_6

    演示了在树控件中来回拖动文件的操作 MyPlayer 音乐播放器 内含歌词显示实现源码 ActiveXDemo 演示了装载以及卸载atl控件的操作以及注册操作 ado 登录模块的制作 ado,dao,odbc数据库连接vc代码 演示了不同的...

    vc++ 开发实例源码包

    演示了在树控件中来回拖动文件的操作 MyPlayer 音乐播放器 内含歌词显示实现源码 ActiveXDemo 演示了装载以及卸载atl控件的操作以及注册操作 ado 登录模块的制作 如题,登陆数据库的操作。 ado,dao,odbc数据库...

    vc++ 应用源码包_5

    演示了在树控件中来回拖动文件的操作 MyPlayer 音乐播放器 内含歌词显示实现源码 ActiveXDemo 演示了装载以及卸载atl控件的操作以及注册操作 ado 登录模块的制作 ado,dao,odbc数据库连接vc代码 演示了不同的...

    vc++ 应用源码包_3

    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...

    JAVA上百实例源码以及开源项目源代码

    EJB中JNDI的使用源码例子 1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件...

    网络互连_网桥.路由器.交换机和互连协议

    一些知识分布在不同的文档中,还有很多非书面的民间智慧。引起混乱的还有教条。信念被当成真理,对任何教条的置疑都会引起不满的回应。但良好的工程要求我们懂得我们在做什么,以及为什么这样做;要求我们保持开放的...

    python入门到高级全栈工程师培训 第3期 附课件代码

    04 meta标签以及一些基本标签 05 img标签和列表标签 06 form表单之input标签 07 通过form向server端发送数据 08 form表单之select标签 09 table标签 第38章 01 css的四种引入方式 02 css的四种基本选择器 03 css的...

    精通qt4编程(源代码)

    \ 第8章 文件处理 蔡志明介绍了Qt的文件处理,包括基于流的文本文件和二进制文件处理,文件信息和目录操作,目录以及文件的变化监控,文件引擎的编写。 219 \ 第9章 网络 李立夏介绍了Qt的网络处理,包括编写常见的...

Global site tag (gtag.js) - Google Analytics