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