RBTree的插入算法

来源:互联网 发布:有价值的域名 编辑:程序博客网 时间:2024/05/20 12:47

红黑树是具有这样特性的一颗二叉搜索树。
1>每个结点不是红色就是黑色。
2>根结点是黑色。
3>如果结点为红色,其子结点必须为黑色。
4>任以结点至NULL的任何路径,所含黑结点数必须相同。
我的想法是这样的:我们要插入结点则必须找到插入的位置,然后调整平衡。只有当我们插入的结点的父结点是是红色的时候才会出现要调整的问题。
插入算法的难点主要是调整平衡的问题。我以插入结点的父结点是插入结点的祖父结点的左孩子为例进行分析,右边是左边的映射同理。由于我们要根据旋转后的图形对结点的颜色进行修改,所以插入结点的叔伯结点就显得尤为重要。
第一种情况:
这里写图片描述
图中的矩形代表结点的子树。
旋转后因为D结点的子树没有变化所以p,g结点的颜色有一个需要是黑色,来确保黑色结点的个数平衡并且在要保证左树上也有一个黑色结点。因此
x->parent->color = BLACK;
x->parent->parent->color = RED;这样才能保证旋转后的黑色结点和之前一样多。
最后进行右转。
第二种情况:
这里写图片描述
同时为确保黑色结点的个数,我们需要这样修改颜色:
x->color = BLACK;
x->parent->parent->color = RED;
最后进行先左后右旋转。
第三种情况:
这里写图片描述
D为红色所以A必须为黑色,所以为确保两个黑色结点的个数相等则
x->color = BLACK;
右旋转过后,我们要继续追溯图中p结点的父结点颜色,如果为红色则我们还需要传入p结点进行调整。
第四种情况:
这里写图片描述
同三,D为红色,则A,B必须为黑色
x->parent->color = BLACK;
先做后右旋转过后,我们要继续追溯图中p结点的父结点颜色,如果为红色则我们还需要传入p结点进行调整。
下面我展示代码:
为了方便追溯上一个结点我们进行结点类型里面加入parent指针指向结点父结点,根节点指向NULL。
这里写图片描述

如有错误之处,还请不吝赐教。

原创粉丝点击