一、介绍
红黑树是一种特殊的二叉查找树(特殊在自平衡上),每个节点会存储本节点的颜色,根节点和叶子节点(NIL或NULL,叶子结点不存储数据)是黑色。从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点(确保没有一条路径 会比其他路径长出两倍)。
应用场景:主要用来存储有序的数据,时间复杂度为O(lgn)。Java集合中的TreeSet和TreeMap,C++STL中的set、map以及Linux虚拟内存的管理都是通过红黑树实现
对于频繁插入、删除的场景,红黑树优势明显
二、自平衡实现
左旋:以某个结点为支点(旋转结点),其右子节点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变
右旋:以某个结点为支点(旋转结点),其左子结点变为旋转结点的父结点,左子节点的右节点变为旋转结点的左子结点
变色:结点的颜色由红变黑或者由黑变红
三、红黑树查找
- 从根结点开始查找,把根结点设置为当前结点;
- 若当前结点为空,返回null;
- 若当前结点不为空,用当前结点的key跟查找key作比较;
- 若当前结点key等于查找key,那么该key就是查找目标,返回当前结点;
- 若当前结点key大于查找key,把当前结点的左子结点设置为当前结点,重复步骤2;
- 若当前结点key小于查找key,把当前结点的右子结点设置为当前结点,重复步骤2;
四、红黑树插入
步骤:①查找插入的位置②插入后自平衡
- 从根结点开始查找;
- 若根结点为空,那么插入结点作为根结点,结束。
- 若根结点不为空,那么把根结点作为当前结点;
- 若当前结点为null,返回当前结点的父结点,结束。
- 若当前结点key等于查找key,那么该key所在结点就是插入结点,更新结点的值,结束。
- 若当前结点key大于查找key,把当前结点的左子结点设置为当前结点,重复步骤4;
- 若当前结点key小于查找key,把当前结点的右子结点设置为当前结点,重复步骤4;
注意:插入结点的颜色为红色,因为这样不会破坏红黑树的黑色平衡