红黑树
概念
红黑树是一种特殊的二叉查找树。红黑树上的每个节点都有存储位表示节点的颜色(红或者黑)。红黑树的效率要非常接近与平衡二叉树。在c++的模版中的map就是基于红黑树来实现的。
我的具体代码的实现在我的github上,有兴趣的同学可以参考一下。
红黑树有如下特性:
- 每个节点或者是黑色、或者是红色。
- 根节点的颜色是黑色。
- 每个叶子节点是黑色。(这里的叶子节点是为空NIL的叶子节点)
- 如果节点是红色的,那么他的子节点必是黑色的。
- 从一个节点到该节点下的叶子节点的所有路径上包含相同数目的黑色节点。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
在红黑树中,叶子节点NIL是不会实际存放键值key的。
基本操作
大家在学习平衡二叉树的时候,为了使一颗二叉树再次达到平衡左旋和右旋就是其中的基本操作。
左旋
如图将A进行左旋,其中F是A的父节点(这里A是F的左子树),B是A的右子树,LB是B的左子树,RB是B的右子树。主要操作如下:
- 将节点B作为F的左孩子。
- 将A作为B的左孩子。
- 将B的左子树LB作为A的右子树。
右旋
如图将A进行右旋,其中F是A的父节点(这里A是F的左子树),B是A的左子树,LB是B的左子树,RB是B的右子树。主要操作如下:
- 将节点B作为F的左孩子。
- 将A作为B的右孩子。
- 将B的右子树RB作为A的左子树。
查找
红黑树是二叉查找树的一种特殊形式其查找方法与二叉查找树相同。下面是具体的情况以及处理的方法,具体操作不在这里详细说明。
- 当查找的key<当前节点的key时,当前节点移动到当前的左孩子
- 当查找的key>当前节点的key时,当前节点移动到当前的右孩子
- 当查找的key=当前节点的key时,就找到了key所在的位置
- 当当前节点为空NULL时,那么就表示查找失败。(这里可以返回查找失败的位置,供插入新的的键值时使用)