5、红黑树的学习

1、红黑树满足的性质。

1、所有节点非红即黑;
2、根节点为黑;
3、最后的NULL节点为黑;
4、红节点的孩子一定为黑;
5、黑平衡:任意一个节点到最后的NULL节点的任意路径黑色节点的个数相同。

2、2-3 树添加元素的过程

2-3树是一颗满足二分搜索树的性质。我们要掌握红黑树,我们必须先了解红黑树。

节点可以存放一个元素和两个元素。

2-3树咋样维护平衡的?

1、添加节点,不能够添加为空的位置。

2、2-3树是一颗绝对平衡的二叉树。

3、我们了解2-3树添加节点的过程。

------------------------------------------------------------------------------------------

1、2-3树插入二节点的过程

 2、如果插入3节点,并且父亲节点为2节点的插入

 2、如果插入3节点,并且父亲节点为3节点的插入

红黑树是保持黑平衡。 不是严格的平衡二叉树, 最大高度:2logn ,O(logn)。

 1、红黑树左旋转的过程。

 

         //   node                    x
	 //  /   \     左旋转       /  \
	 // T1   x   --------->   node   T3
	 //     / \              /   \
	 //    T2 T3            T1   T2
	 Node<K, V> * leftRotate(Node<K, V> * node){
		 Node<K, V> * x = node->right;
		 // 左旋转
		 node->right = x->left;
		 x->left = node;
		 x->color = node->color;
		 node->color = RED;
		 return x;
	 }

2、红黑树颜色翻转的过程。

 

 // 颜色翻转
	 void flipColors(Node<K, V> *  node){

		 node->color = RED;
		 node->left->color = BLACK;
		 node->right->color = BLACK;
	 }

颜色翻转,当我们在添加到3节点的右边,我们需要向上转型,我们需要把向上面转型的节点,变为红色,然后它的子节点,变为黑色。

 

 

	 //     node                   x
	 //    /   \     右旋转       /  \
	 //   x    T2   ------->     y   node
	 //  / \                       /  \
         // y  T1                     T1  T2
	 Node<K, V> * rightRotate(Node<K, V> * node){

		 Node<K, V> *  x = node->left;

		 // 右旋转
		 node->left = x->right;
		 x->right = node;

		 x->color = node.color;
		 node->color = RED;

		 return x;
	 }

2、红黑树插入元素的过程。

 

        // 向以node为根的二分搜索树中插入元素e,递归算法
	Node<K, V>  * add(Node<K, V> * node, K k, V  v){
		if (node == NULL){
			size++;
			return new Node<K, V>(k, v);
		}
		if (k < node->key){  //表示的是 该值比较小,并且它的左孩子为NULL
			node->left = add(node->left, k, v);  //去节点的左边找。
		}
		else  if (k > node->key){  //表示的是该值比较大,并且它的右孩子为NULL
			node->right = add(node->right, k, v);//去节点的右边找。
		}
		else{
			node->value = v;
		}

		if (isRed(node->right) && !isRed(node->left))
			node = leftRotate(node);

		if (isRed(node->left) && isRed(node->left->left))
			node = rightRotate(node);

		if (isRed(node->left) && isRed(node->right))
			flipColors(node);

		return node;
	}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值