文章目录:
1. 红黑树
1.1:概念
红黑树:是一种二叉搜索树,每个节点添加了一个存储位表示当前节点的颜色,可以是红色(Red)或者黑色(Black);
红黑树通过对任何一条从根到叶子节点的路径上节点的着色方式进行限制,使得红黑树最长路径长度不会超过最短路径的二倍,所以红黑树是接近平衡的(相对平衡)
1.2:红黑树的性质
1. 每个节点不是红色就是黑色
2. 根节点是黑色
3. 如果一个节点是红色,则他的两个节点必须是黑色(不能出现连续的两个红色节点)
4. 对于每个节点,从该节点到其所有后代节点的简单路径上,均包含相同数目的黑色节点
5. 每个叶子节点都是黑色的(这里的叶子节点是指外部节点、空节点)
根据性质3和4,对于一棵红黑树:
最短路径:当前路径全是黑色节点;
最长路径:当前路径由红、黑节点交替排布;
又因为每条路径的黑色节点数量相同,所以最长路径长度不会超过最短路径的二倍
一般情况下,不会出现一条路径全是黑色节点的情况。
1.3:红黑树的时间复杂度
假设:一棵红黑树有N个节点,其中有X个黑色节点,那么N的范围为:[ X ,2X ]
最短路径查询的时间复杂度:O(logX)
最长路径查询的时间复杂度:O(log2X) = O(log 2 + log X )
= O(1 + log X) =O( log X)
所以红黑树查询的时间复杂度:O(logN)
2. 实现红黑树(Red-Black Tree)
2.1:红黑树节点的定义
public class RBTree {
public static class RBTreeNode {
public RBTreeNode left;
public RBTreeNode right;
public RBTreeNode parent;
public int val;
public Color color;
RBTreeNode(int val){
this.val=val;
//新增节点不能是黑色的,默认是红色的
//如果是黑色,要保证每条路径上黑色数量相同,就可能存在问题
//可能需要新增很多节点
this.color=Color.RED;
}
}
public RBTreeNode root;
}
注意:红黑树新增节点默认是红色节点
颜色用枚举类表示:
public enum Color {
RED,BLACK
}
2.2:红黑树插入节点操作
红黑树本质上是一棵相对平衡的二叉搜索树,每个节点多了一个属性表示颜色,所以插入一个节点的步骤:
1. 按照二叉搜索树的方式插入节点;
2. 调整节点的颜色;因为插入节点是红色节点,可能使插入节点后的二叉树不符合红黑树的性质。
插入节点后,可能的情况:
(约定:cur-当前节点 p-父节点 u-叔叔节点 g-祖父节点)
父节点在祖父节点的左侧: