纯属个人笔记,来自《Java数据结构和算法》
二叉搜索树
满足l.data<data<r.data
平衡树
满足|rh - lh|<=1
RBTree
一、满足一下规则就是平衡树
1.每个节点红色或黑色
2.根总是黑色
3.如果节点时红色的,则它的子节点必须是黑色的
4.从跟到叶节点或空子节点的每条路径,必须包含相同数目的黑色节点
(黑色深度需要相同)
重复的关键字要分配到关键字的两侧
二、修正违规的情况:
1.改变节点颜色
一般为改变根节点
2.执行旋转操作
RoR,右旋转:执行一次旋转,所有的节点都将改变位置,旋转节点的左子节点会成为他的父节点,他将成为右子节点,他的右子节点仍然是他的右子节点
RoL,左旋转:执行一次旋转,所有的节点都将改变位置,旋转节点的右子节点会成为他的父节点,他将成为左子节点,他的左子节点仍然是他的左子节点
旋转中的特殊情况-节点平移,指的是旋转节点要成为子节点的子节点,但是当子节点已经有了子节点,那么右旋,会平移到右子节点,反之亦然。
旋转时可以平移子树
三、插入节点
概念:G->P->X
外侧子孙,p和x都是左子节点或右子节点
内侧子孙,反之,p和x的左右位置不同
在节点下行途中的颜色变换
每当查找例程遇到一个有两个红色子节点的黑色节点时,则必须把子节点变为黑色,父节点变为红色
--会引起问题3,因为子根变为了红色
插入后的旋转
插入后有三种情况
1.P是黑色的
2.P是红色的,X是G的一个外侧子孙节点
3.P是红色的,X是G的一个内侧子孙节点
当是1时,不用做任何处理
当是2时,需要一次旋转和一些颜色变换
改变G和P的颜色,G进行旋转,将X向上升的方向(一般P是什么子,就反着转,如是左子, 就右旋)
当是3时,需要两次旋转和一些颜色变换
改变G和P的颜色,先P旋转,P是什么子,就怎么选(如是左子,就左旋),这样可以讲节点变为外侧子孙节点;接着跟情况2相同,G进行旋转,将X向上升的方向
在节点下行途中的旋转
(在所有的颜色变换情况,当子根变为了红色,都会导致问题3)
同样也有两种情况,子跟变换之后成为1.外侧子孙节点 2.内侧子孙节点
这是X节点为违背节点,操作和插入时的2,3情况操作相同
四、删除节点
可以如同普通二叉树那样,用中续后的节点代替;
或是不删除节点,只是忽略这个节点
相关推荐
在给定的“使用Java语言实现的rbtree红黑树”压缩包中,可能包含了自定义实现的红黑树类,用于学习和理解红黑树的内部工作原理。这样的实现可以帮助开发者深入理解数据结构,以及如何在实际编程中应用这些概念。 ...
红黑树(Red-Black Tree)是一种自平衡的二叉查找树,由计算机科学家Rudolf Bayer在1972年提出。它在保持二叉查找树特性的同时,通过引入颜色属性来确保树的平衡,从而提高数据操作的效率。在C语言中实现红黑树,...
红黑树(Red-Black Tree)是一种自平衡的二叉查找树,由计算机科学家Rudolf Bayer在1972年提出。它在保持二叉查找树特性的同时,通过引入颜色属性来确保树的平衡,从而优化了插入、删除和搜索操作的时间复杂度。红黑...
在提供的“rbtree”压缩包中,很可能包含了红黑树的实现代码,这可能是C、C++或其他支持面向对象编程的语言,如Java或C#。代码可能定义了一个红黑树的数据结构,包括节点类(包含颜色属性和左右子节点),以及插入、...
红黑树(Red-Black Tree)是一种自平衡二叉查找树,由计算机科学家鲁道夫·贝尔在1978年提出。它在保持二叉查找树特性的同时,通过引入颜色属性来确保树的平衡,从而提高了数据操作的效率。红黑树的主要目标是保证在...
- `RBTree`类:作为红黑树的容器,包含根节点、插入、删除、查找等成员函数。 - 构造函数:初始化空树,根节点为黑色。 - `insert`函数:插入新节点并保持红黑树性质。 - `erase`函数:删除指定节点,并调整树...
在给定的文件中,"rbtree.cpp"很可能是实现红黑树节点定义和操作的代码,包括旋转、颜色调整、插入和删除等功能。"main.cpp"则是测试和驱动程序,用于验证红黑树实现的正确性。"rbtree.h"可能包含了红黑树的类定义和...
而`RBtree.h`则可能定义了红黑树的类结构以及相关的接口声明,供其他模块引用和调用。 6. **应用场景**: 红黑树广泛应用于各种数据结构和算法中,例如标准模板库(STL)中的`std::map`和`std::set`就是基于红黑树...
RBTree很可能是实现了红黑树的数据结构代码,而BTree可能是指B树(一种自平衡的多路搜索树),虽然它不是红黑树,但也是另一种常用于动态排序和存储的数据结构。 总之,红黑树是计算机科学中的一个重要概念,广泛...
- `RBTree` 类是红黑树的实现类,它使用 `TreeNode` 类作为其内部节点的类型。 - `header` 成员变量是一个特殊节点,用于简化红黑树的边界条件处理,例如在空树的情况下,`header` 可以充当伪根节点,使得所有操作都...
红黑树的遍历,查找过程,以及插入时对红黑树进行位置修复,修复包括左旋右旋,还有就是红黑树节点的删除,删除之后还要对节点修复
- `rbtree.h`文件通常会包含红黑树的数据结构定义,以及相关的函数声明。数据结构可能包括一个表示树节点的结构体,其中包含键值、颜色属性(红色或黑色)、左子节点、右子节点以及父节点等字段。此外,可能还会声明...
在"rbtree-master"这个压缩包中,很可能包含了红黑树的C语言实现源代码,包括数据结构定义、插入、删除、查找等操作的函数,以及可能的测试用例和示例。通过学习和理解这些源代码,你可以深入了解红黑树的内部工作...
`RBTree.java`类将实现红黑树的基本操作,如插入、删除、查找等。插入操作需要考虑新节点的位置以及如何保持红黑树的性质;删除操作则可能涉及节点的替换、颜色调整和旋转等复杂操作。为了确保正确性,插入和删除...
红黑树是一种自平衡二叉查找树,由Rudolf Bayer在1972年提出。它的设计目标是在保持二叉查找树基本性质的同时,通过引入颜色属性来保证树的平衡,从而达到高效的插入、删除和查找操作。在这个“红黑树demo python...
- `RBTree`:红黑树的主体类,包含插入、删除、查找和打印树的方法。 使用这些源码,可以学习和理解红黑树的具体实现细节,比如如何处理插入和删除时的平衡问题,以及如何在Java中编写高效的二分查找树代码。 6...
`RBTree` 类用于实现红黑树的主要操作,如插入、删除等。 - **构造函数**:初始化红黑树。 - **create** 方法:创建红黑树,接收一个整型数组,遍历数组并调用 `insert` 方法插入每个元素。 - **insert** 方法:...
`RBTree.cpp`和`RBTree.h`这两个文件通常包含了红黑树的C++实现。在`RBTree.h`中,你可能会看到红黑树节点的定义,包括节点的颜色(RED或BLACK),键值,左子节点,右子节点以及可能的父节点。此外,这个头文件还...
在压缩包中的"rbtree"文件,可能是一个源代码文件,包含了实现红黑树的数据结构和相关操作的函数。通过阅读和理解这个文件,你可以学习到如何在实际编程中应用红黑树,以及如何在C++环境中组织代码来实现复杂数据...
在Linux内核源代码中,红黑树的实现位于`include/linux/rbtree.h`和`include/linux/rbtree_augmented.h`等头文件中。主要的数据结构定义为`struct rb_node`,它包含指向父节点、左子节点和右子节点的指针,以及表示...