红黑树规则:
1.每一个节点不是红色就是黑色
2.根总是黑色的
3.如果节点是红色,则他的子节点必须是黑色的
4.从根到叶节点的每条路径,必须包含相同数目的黑色节点
红黑树的设计:
红黑树的单旋转:
单旋转实验:
int main()
{
const int NEG_INF = -99999;
RedBlackTree<int> t(NEG_INF);
t.Insert(30);
t.Insert(15);
t.Insert(70);
t.Insert(20);
cout << t.header->right->element << endl;
cout << t.header->right->left->element << endl;
cout << t.header->right->right->element << endl;
cout << t.header->right->left->right->element << endl;
cout << "向右转" << endl;
t.rotateWithLeftChild(t.header->right); //向右转
cout << t.header->right->element << endl;
cout << t.header->right->right->element << endl;
cout << t.header->right->right->left->element << endl;
cout << t.header->right->right->right->element << endl;
cout << "再向左转,回到原来的位置" << endl;
t.rotateWithRightChild(t.header->right);
cout << t.header->right->element << endl;
cout << t.header->right->left->element << endl;
cout << t.header->right->right->element << endl;
cout << t.header->right->left->right->element << endl;
return 0;
}
单旋转的问题:
如下图,当发生单旋转时,如果有一个子树的深度比较大,那么旋转之后它的深度依然很大,这就不符合平衡了
需要双旋转来解决这个问题
双旋转
DoubleRotateWithLeftChild函数的模型:
DoubleRotateWithRightChild函数模型:
双旋转测试
int main()
{
const int NEG_INF = -99999;
RedBlackTree<int> t(NEG_INF);
t.Insert(12);
t.Insert(16);
t.Insert(8);
t.Insert(10);
t.Insert(4);
t.Insert(14);
t.Insert(2);
t.Insert(6);
t.Insert(5);
cout << t.header->right->element << endl;
cout << t.header->right->left->element << endl; //原来是8,
cout << t.header->right->left->left->right->left->element << endl;
cout << "向右旋转" << endl;
t.DoubleRotateWithLeftChild(t.header->right->left);
cout << t.header->right->element << endl;
cout << t.header->right->left->element << endl; //旋转后是6
cout << t.header->right->left->left->right->element << endl; //旋转后的5
return 0;
}
下一章节完善Insert函数,让它支持自动平衡