红黑树:平衡二叉树
jdk1.8 HashMap:数组+链表+红黑树 (处理Hash冲突)
时间复杂度:树的深度:logn
红黑树性质:
1.每个节点不是红色就是黑色
2.不可能有连在一起的红色节点(两个黑色节点可以连在一起)
3.根节点(入度为0)都是黑色root
4.每个红色节点的两个子节点都是黑色。
5.叶子节点(出度为0)都是黑色
为满足红黑树性质,红黑树有三种变换:
1.变颜色 2.左旋 3.右旋
变换规则:
1:当前节点的父亲是红色,且它的祖父节点的另一个子节点(叔叔节点)也是红色:
步骤:
(1)把父节点设为黑色
(2)把叔叔节点也设为黑色
(3)把祖父节点(父亲的父亲节点(爷爷节点))设为红色
(4)把指针定义到祖父节点设为当前要操作的分析的点变换规则
2.左旋:当前父节点是红色,叔叔节点是黑色的时候,且当前的节点是右子树。 ——>左旋:以 父节点 作为根节点 左旋
3.右旋:当前父节点是红色,叔叔节点是黑色的时候,且当前的节点是左子数。 ——>右旋:以 祖父节点 作为根节点 右旋
颜色变换步骤:
(1)把父节点变为黑色
(2)把祖父节点变为红色
基本代码展示:
public class RedBlackTree {
private final int R=0;
private final int B=1;
private Node root=null; //红黑树根节点
class Node{
int data; //存的具体数字
int color=R;
Node left;
Node right;
Node parent;
public Node(int data){
this.data=data;
}
}
//插入
public void insert(Node root, int data){
if(root.data<data){
if(root.right==null){
root.right=new Node(data);
}else{
insert(root.right,data);
}
}else{
if(root.left==null){
root.left=new Node(data);
}else{
insert(root.left,data);
}
}
}
//左旋
public void leftRotate(Node node){
if(node.parent==null){ //表示根节点
//确定ES
Node E=root;
Node S=E.right;
//移S左子数
E.right=S.left;
S.left.parent=E;
//修改E的指针
E.parent=S;
//修改S的指针
S.parent=null;
}
}
}
来源:CSDN
作者:林浩吧
链接:https://blog.csdn.net/weixin_45335305/article/details/103747286