红黑树(二叉搜索树的一种)

本文详细介绍了红黑树的性质,包括每个结点的颜色、根结点和叶子节点的颜色规则,以及从根到任意叶子节点的路径上黑色结点的数量相等,确保树的平衡性。文中还阐述了如何通过旋转操作来调整树结构,以维持红黑树的性质,包括LEFT-ROTATE函数的实现。此外,讨论了插入和删除操作对红黑树的影响及调整策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

满足如下性质:
    每个结点或是红色的,或是黑色的
    根结点是黑色的
    每个叶节点(NIL)都是黑色的
    如果一个结点是红色的,则其两个子结点都是黑色的
    对每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点

    ——>确保没有一条路径会比其他路径长出两倍,是近似于平衡的
              一棵有n个内部结点的红黑树的高度至多为2 lg(n+1)


树操作TREE-INSERT和TREE-DELETE会对树做了修改,为了维持这些性质,必须要改变树中某些结点的颜色以及指针结构
修改指针结构通常通过旋转(左旋和右旋)来完成
LEFT-ROTATE(T, x)【涉及到x, y】
    y = x.right
    x.right = y.left
    if y.left != T.nil            //如果y的左孩子不是空的,则它变为x的右孩子后,需要修改它的父亲结点
        y.left.p = x
    y.p = x.p
    if x.p == T.nil              //如果一开始x是根结点
        T.root = y
    elseif x == x.p.left       //修改x的父亲结点的后继
        x.p.left = y
    else
        x.p.right = y
    y.left = x
    x.p = y
    
插入
1. 同二叉搜索树的插入一样,找到插入的位置,但是可能破坏红黑树的性质,因此需要调整回来
2. 调整恢复红黑树的性质,称插入的结点为z
    1) z的叔结点y是红色的,则将z结点的父结点和叔结点都改成黑色;并将z上升至z的父结点的父结点
    2) z的叔结点y是黑色的且z是一个右孩子,先做一次左旋转,将z转换为左孩子,从而进入第3)种情况
    3) z的叔结点y是红色的且z是一个左孩子,做一次右旋转
    总的时间复杂度为O(lg n)

删除比插入复杂一点,这里就不多讲了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值