快速记忆红黑树规则之插入节点

版权声明:转载请注明出处 https://blog.csdn.net/HeXiQuan123/article/details/86756881

红黑树是二叉树的一种,只是有些链接是红的,有些链接是黑的,目的和2-3树一样,为了均衡!

def:红链接均为left*;

没有一个节点可以同时和两条红链接相连;

完美黑色平衡,根到任一叶子的黑色路径数目相同。

自然而然,如同二叉树数据结构,我们的目的插入,查找,删除;

在插入算法之前,有个重要的旋转操作,node* rotateleft(node*)和node*rotateright(node*);分别对应右链接为红与左链接为红。

同2-3树,我们分情况讨论插入(构造红黑树法则)

        向2-节点插入新键:if    new key<k,node(k)->left=new node(red,newkey,newval);

                                                   else      node(k)->right=new node(red,newkey,newval);&&;rotateleft(node)

                                                 简单理解就是插就插红链接,红链接变成右链接了再左旋转维持红黑树特性。

        向3-节点插入新键,在这里很明显3-节点指的两个2-节点的红链接,图示后续补上。root表示指向3-节点的指针

                                        需要考虑的情况也很简单,newkey最小/最大/中间。

                                        插入的节点是node(red,newkey,newval),简写为new node

                                        对于新键最大,这时非常简单,直接放到右边root->right=new node,然后把两个红链接都变黑。

                                        对于新键最小,这时插到3-节点的最左边root->left->left=new node

                                                                 然后右旋转rotateright(root);//这里root其实变成了中间节点,原3-节点的root->left;

                                                                 变黑 turnblack( root->left )  turnblack( root->right );

                                        对于新键位于中间,插到root->left的右边,即root->left->right=new node;

                                                                 随后左旋转rotateleft( root->left)

                                                                 然后右旋转rotateright(root)

                                                                 变黑 turnblack( root->left )  turnblack( root->right );

向树底部3-节点插入新键:这时涉及到一个向上传递的问题,其实就是上述插入3-节点,变黑步骤后多一步root->color=red(3-节点开始肯定是黑的),插入二节点则不进行改变,

《算法》中关于插入操作总结的很好,因为涉及到颜色的上浮,所以一定是后序遍历

if(当前节点is null) return new node(red).//这一步return很标准,保证了后面的node不可能是null,所以一定会有left&&right

h->left=put(h->left);

h->right=put(h->right);

{颜色变化}

关于颜色,null节点为黑色

关于颜色变化:总结就是三种情况:

1.左红,右红,对应插入3-节点的最后一步,所以变黑,然后root变红(红色上浮)

2.左黑,右红,对应2-节点中的第二种情况和3-节点中的第三种情况中的左旋部分,所以左旋rotateleft

3.左红,左左红,对应3-节点中情况2和情况3左旋后情况,所以右旋。

猜你喜欢

转载自blog.csdn.net/HeXiQuan123/article/details/86756881