您的位置:首页 > 理论基础 > 数据结构算法

数据结构——红黑树

2018-02-04 15:22 405 查看

                                  红黑树

为什么要红黑树

      红黑也是一种二叉平衡树,但红黑树不要求全局平衡,只需要局部平衡,这样的好处是在插入和删除这种改变树形态的操作时效率更高。普通的二叉平衡树要求全局平衡,为之付出的代价会非常大。但红黑树只要求局部平衡,需要查找的性能不是最优的,但也是比较优的,而且平衡的代价也比较小,红黑树对修改的查找效率进行了平衡取舍。2-3树由于有两种节点类型,并且4节点的分裂比较复杂,因此效率也不太高。

红黑树的性质

       红黑树是一种二叉平衡树,那么就要求每个节点最多最能有两个节点。红黑树之所以叫红黑树是因为在定义中给
       (1)树中的每个节点都标志了一个颜色,要么是红节点,要么是黑节点。
       (2)并且要求根节点必须是黑节点
       (3)所有的为空的叶子节点必须是黑节点
       (4)每个红节点的两个子节点必须是黑节点,这样保证了红节点不可能连续。
       (5)从一个节点到它的子孙节点的路径上包含相同数量的黑节点。
      在插入和删除操作过程中,必须保证这五个性质不被破坏,也就是说要通过相应的旋转和变色操作来恢复这五个性质。
      通过给BST的每个节点添加上颜色,并且让所有节点都满足这5个性质,在红黑树进行相应的插入的删除操作时,效率将会大大提高,基本上,红黑树的插入删除操作的时间复杂度也是对数级别的,因为红黑树维持了树的局部平衡,因此其查找时间复杂度也是对数级别的。

红黑树的插入操作

       红黑树在插入时可能会破坏树的平衡和这五条性质,就需要通过旋转和变色来恢复。红黑树的旋转跟二叉平衡树一样。
      当插入的节点是根节点时,直接把根节点设置成黑节点(为了保证性质2)
      如果要插入的节点的父节点是黑节点时,而插入的节点是红节点,可以直接插入
      如果插入节点的父节点是红节点并且父节点是祖先节点的左子节点时分两种情况,如果祖先节点的右子节点是黑节点,如果插入节点是父节点的左子节点,这时插入节点是红节点,而父节点也是红节点,不满足性质4,这时要将祖先节点进行右旋转,并且将祖先节点和父节点的颜色进行对换。如果插入的节点是父节点的右子节点,则对父节点进行左旋。如果要插入的节点的父节点是祖先节点的右子节点时跟前一种情况完全镜像,只需要镜像操作即可。如果要插入的节点的父节点和祖先节点的右子节点都是红节点,那么就只需要把父节点和祖先节点的右节点都变成黑节点即可。

下面是对红黑树的代码实现

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: