之前看了一段时间红黑树,对它的性质有了初步的了解,但是它的插入操作较为复杂,放另一篇博文中写,删除操作则是压根没怎么看懂,如果以后要用到这个数据结构再对其删除操作进行研究。
性质:
先是特点:首先它是一棵二叉平衡搜索树。首先何为二叉搜索树,二叉搜索树就是对该二叉树中任一节点满足:左子树根节点的值(如果存在)<当前节点的值<右子树根节点的值(如果存在)。对于这样一种二叉树,显然在极端情况下(只有右子树或只有左子树),它会退化成类似于单链表的结构,插入、删除、查找时间复杂度都为O(n),但是对于平衡的二叉搜索树显然不会出现这一问题,因为它的任意节点的左右子树高度之差不超过1。那么红黑树作为一种平衡树自然也有自己独特的性质,为以下五点:
1、任意节点非黑即红
2、根节点黑
3、叶节点黑(叶节点不含值,只有颜色)
4、红节点必须跟两个黑子节点
5、任意节点到它叶子节点的简单路径上包含相同数目的黑节点。
满足这五个性质的二叉搜索树即为红黑树,至于为什么满足满足这五个性质二叉搜索树就能平衡算法导论书中也没有说,本人也没去查其证明过程(估计十分复杂)。
左旋与右旋:
//左旋的前提是右子树不能为空(红黑树中是不能为叶子节点)
void Left_Rotate(T * x,T * root)
{
T *y=x->right;
//先处理跑下去的x
x->right=y->left;
if(y->left!=NIL)
y->left->parent=x;
// 在处理跑上去的y
y->parent=x->parent;
if(x->parent==NIL)
{root=y;}
else if(x->parent->left==x)
{y->parent->left=y;}
else
{y->parent->right=y;}
//最后处理x,y之间的联系
x->parent=y;
y-left=x;
}
//右旋的前提是左子树不能为空(红黑树中是不能为叶子节点)
void Right_Rotate(T * y,T * root)
{
T *x=y->left;
//先处理跑下去的y
y->left=x->right;
if(x->right!=NIL)
{x->right->parent=y;}
//在处理跑上去的x
x->parent=y->parent;
if(y->parent==NIL)
{root=x;}
else if(y->parent->left==y)
{x->parent->left=x;}
else
{x->parent->right=x;}
//最后处理x,y之间的关系
y->parent=x;
x->right=y;
}