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了。
最后,我的文章都是写给自己看的,所以,很多地方很懒,自己懂就好了。
相关推荐
红黑树是一种自平衡的二叉查找树,它在数据结构和算法领域有着重要的应用,尤其是在需要高效查找、插入和删除操作的场景中。它的设计目标是确保任何节点到其每个叶子节点的所有路径都大致相等,从而避免了二叉查找树...
在C++中,理解并掌握二分搜索树的概念、操作以及实现方法对于编程实践至关重要。二分搜索树的核心特性是每个节点的左子树仅包含比该节点小的元素,右子树则包含比该节点大的元素,这种特性使得搜索、插入和删除等...
二分查找算法不仅可以用于查找,还可以进行一些变体操作,如插入、删除和查找最近的元素等。在高级数据结构如平衡二叉搜索树(AVL 树、红黑树等)中,二分查找的概念也被广泛运用。理解并熟练掌握二分查找算法对于...
二分查找,也被称为折半查找,是一种在有序数组中高效地查找特定元素的搜索算法。这个算法基于分治策略,将问题分解成更小的部分,直到问题变得足够简单以至于可以直接解决。在二分查找中,我们首先找到数组的中间...
3. 二分查找树:基于二分查找概念构建的数据结构,每个节点都有两个子节点,左子节点的值小于当前节点,右子节点的值大于当前节点,方便进行插入、删除和查找操作。 六、代码实现 在Python中,一个简单的二分查找...
通过上述分析,我们可以看到作者实现了一个基于数组的二分搜索树,虽然这并不是真正意义上的二叉树结构,但依然能够有效地进行查找、删除和输出等操作。对于学习数据结构和算法的同学而言,这段代码提供了一个简单的...
本文将深入探讨几种常见的查找技术,包括顺序查找、二分查找以及基于数据结构的查找方法。 1. **基本概念** - 查找成功:如果在数据集合中找到了特定元素,就认为查找成功,并返回该元素的信息。 - 查找不成功:...
本文将主要讨论基础查找方法以及基于二分查找的有序符号表的实现。 首先,符号表(Symbol Table)是一个抽象数据类型(ADT),它存储键值对,并提供基本操作:插入(put)、查找(search)和删除(delete)。在无序...
二分搜索算法是一种高效、基于比较的搜索算法,主要应用于有序的数据集合中。它通过将目标值与数据集的中间元素进行比较,不断缩小搜索范围,直到找到目标值或者确定目标值不存在。这个过程通常在计算机科学中被称为...
查找算法通常根据数据的存储方式和查找方法进行分类,常见的查找算法包括线性查找、二分查找、分块查找、基于树的查找(例如二叉查找树BST、平衡树AVL树、B树和B+树)以及散列技术等。 查找算法的学习目标包括理解...
本文将深入探讨标题和描述中提及的六种基本运算:直接插入排序、冒泡排序、直接选择排序、堆排序、希尔排序以及二分查找,并结合C语言这一常用编程语言进行阐述。 1. **直接插入排序**: 直接插入排序是一种简单的...
此外,为了提高效率,可能会有预处理步骤,例如对词汇进行排序,这样在插入和查找时可以利用二分查找或其他高效的查找算法。在实际应用中,可能还需要考虑如何处理未登录词(不在词典中的词)以及如何处理中文分词的...
例如,二分查找法适用于有序数组,而散列表的查找则依赖于哈希函数。 总结来说,动态查找表是一种能够适应数据变化的数据结构,它结合了数据抽象和高效查找算法,以提高数据操作的效率。理解并掌握动态查找表的原理...
顺序查找虽然操作简单但是不适用于表长过长的查找,而二分查找则可以高效地查找大规模的数据集合。动态查找可以使用链表或树形结构来实现,基于链式存储的二叉排序树也是一种高效的查找方法。 八、结论 查找是数据...
为了有效地执行查找操作,我们需要了解一些关键的概念。 1. **数据表**:指的是存储数据的结构或容器,如数组、链表等。 2. **关键字**:是用于标识记录的字段,它是查找操作的目标。例如,在一个学生记录系统中,...
在实际应用中,除了基本的数组或列表,还可以使用Java的`TreeSet`或`TreeMap`等数据结构,它们底层已经实现了红黑树,插入操作的时间复杂度为O(log n),无需手动进行二分查找和元素移动。但如果你对内存占用或特定...
实验8的查找算法比较报告主要涉及七种不同的查找方法,分别是顺序查找、二分查找、插值查找、斐波那契查找、树表查找、分块查找和哈希查找。这些算法在计算机科学中用于在数据集合中寻找特定元素。 **查找的概述** ...
本资料包详细介绍了几种常见的查找算法,包括顺序查找、二分查找、分块查找、二叉排序树查找以及哈希查找。 **顺序查找**是最基础的查找方法,适用于任何无序或有序的数据序列。它按照元素的顺序逐个比较,直到找到...