红黑树性质与变换规则

a 夏天 提交于 2020-01-26 10:12:53

红黑树:平衡二叉树

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;
		}
	}
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!