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

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

我的理解是红色是融合的

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

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

 

 

红黑树、2-3树

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

红黑树、2-3树

红黑树、2-3树

 

红黑树、2-3树

红黑树、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树

 

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

 

 

 

 

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

 

添加节点的两种情况

父节点为2-节点

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

红黑树、2-3树

最后就是往上融合

红黑树、2-3树

 

父亲节点为3-节点

红黑树、2-3树

红黑树、2-3树

 

 

红黑树添加元素

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

红黑树、2-3树红黑树、2-3树

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

红黑树、2-3树

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

红黑树、2-3树

 

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

 

 

另一种情况,需要选择

红黑树、2-3树

红黑树、2-3树

 

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

红黑树、2-3树

 

红黑树、2-3树红黑树、2-3树

然后颜色进行翻转

红黑树、2-3树

 

        //    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;
   	}

 

相关文章: