红黑树、2-3树

红黑树与2-3树的等价性

所有的红色节点都是左倾斜的

我的理解是红色是融合的

红黑树与2-3树是等价下,我们看图片 比较一下

红色节点是不是融合和在左边

 

 

算法导论中的红黑树的理解

 

红黑树是保持"黑平衡"的二叉树

严格意义上,不是平衡二叉树 最大高度2logn O(logn)

 

红合数

2-3树

满足二分树的基本性质

节点可以存放一个元素或者两个元素

左边a是和二叉树一样的结构 左节点存放小于a的值,右边存放大于a的值

右边的b、c是两个元素 左边存放小于b、c的值、中间存放b、c之间的值、右边存放大于b、c的值

 

 

 

 

2-3树如何维持绝对的平衡

 

 

 

 

永远不回去空节点,只会去融合

 

添加节点的两种情况

父节点为2-节点

零时的四节点,然后往下拆分为二分树,然后在向上融合

最后就是往上融合

 

父亲节点为3-节点

 

 

红黑树添加元素

添加66,红颜色代表融合元素

他们不是融合元素,变为黑色,但是还要往跟节点融合,所以42要变为红色

这种条件不需要选择,直接颜色旋转就行

 

   //颜色翻转
   private void flipColor(Node node){
	   
	   node.color=RED;
	   node.left.color=BLACK;
	   node.right.color=BLACK;
   }

 

 

另一种情况,需要选择

 

因为需要平衡,所以右旋转

 

然后颜色进行翻转

 

        //    node                        x
	//    /   \     右旋转         		/  \
	//   x   T2   --------->       Y   node
	//  / \              		  	   /   \
	// y  T1             			  T1   T3
   	public Node rightRotate(Node node){
   		
   		Node x=node.left;
   		
   		//右旋转
   		node.left=x.right;
   		x.right=node;
   		
   		x.color=node.color;
   		node.color=RED;
   		
   		return x;
   	}

 

//  node                      x
   //  /   \     左旋转         		/  \
   // T1   x   --------->    node   T3
   //     / \              	/   \
   //    T2 T3             T1   T2
   private Node leftRotate(Node node){

       Node x = node.right;

       // 左旋转
       node.right = x.left;
       x.left = node;

       x.color = node.color;
       node.color = RED;

       return x;
   }

   //颜色翻转
   private void flipColor(Node node){
	   
	   node.color=RED;
	   node.left.color=BLACK;
	   node.right.color=BLACK;
   }
   
	//    node                        x
	//    /   \     右旋转         		/  \
	//   x   T2   --------->       Y   node
	//  / \              		  	   /   \
	// y  T1             			  T1   T3
   	public Node rightRotate(Node node){
   		
   		Node x=node.left;
   		
   		//右旋转
   		node.left=x.right;
   		x.right=node;
   		
   		x.color=node.color;
   		node.color=RED;
   		
   		return x;
   	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值