红黑树

红黑树是一种非严格均衡二叉树。是实现treeMap存储结构的基石

均衡二叉树是在二叉搜索树的基础上增加了自动维持平衡的特性。

二叉搜索树:又叫二叉查找树,二叉排序树

特性:1、节点的左子树和右子树都小于节点本身。2、节点的左右子树同样都为二叉搜索树

如下,典型的二叉搜索树(查找某个数使用二分查找)

下图也是二叉搜索树,但是很别扭假如要查找值位50,性能会很低。在这个基础上,引进均衡二叉树

经过自动平衡后,变成下图均衡二叉树。

红黑树就是非严格均衡二叉树,也具备自动维持均衡的特性,特点:

1、节点分为红色和黑色

2、根节点必为黑色

3、叶子节点都为null,且为黑色

4、新加到红黑树的节点是红色节点

5、不会出现两个相连的红色节点(红色节点下的两个子节点必为黑色节点)

6、从任意节点出发,到其每个叶子节点的路径中包含相同数量的黑色节点

红黑树最长路径不大于最短路径的2倍

红黑树最短路径:特点6可推出,从根节点到每个叶子节点的黑色节点数量是一样的,最短路径就是由纯黑色节点组成的路径。

红黑树最长路径:规则3和5可推出,一个红色节点必然连接黑色节点,当红色节点和黑色节点数量相同时,就是最长路径

为什么新加入到红黑树的节点是红色节点?

规则6可推出,当前红黑树从根节点到每个叶子节点的黑色节点数量相同的,若此时加入一个黑色节点,必然破坏规则。如果加入一个红色节点就不一定会破坏规则。除非加入红色节点的父节点是红色节点。加入红色节点破坏规则可能性更小。

红黑树结构被破坏,需要通过"变色"和"旋转"来维持均衡,"旋转"分为"左旋"和"右旋"

红黑树插入节点:

不需要调整即可平衡:当父节点为黑色节点时插入子节点

需要"变色"才能维持平衡:

1、当父节点和叔父节点都是红色节点时

2、插入的节点位根节点

需要"变色"和"旋转"才能平衡:(父节点位红色,叔父节点为黑色)

1、父节点是左节点,插入节点是左节点,此时需要右旋祖父节点,再通过变色才能维持平衡。新加入55

2、父节点是左节点,插入节点是右节点,需要先左旋父节点,再右旋祖父节点,最后变色维持平衡。新加入67

3、父节点是右节点,插入节点是右节点。左旋祖父节点,变色

4、父节点是右节点,插入节点是左节点。右旋父节点,再左旋祖父节点,变色。

 

红黑树节点删除:(如果违反规则,通过"变色"或者"旋转"调整)

1、待删除节点其左右节点都是null:直接删除该节点,复制null

2、待删除节点左右节点有一个是null:删除该节点后将有值的那个节点取代当前删除的节点。

3、子节点都是非null:

一、找到该节点的前驱或者后继,

前驱:左子树中最大的节点。(该节点.prev)

后继:右子树中最小的节点。(该节点.next)

(前驱或者后继最多只有一个非null子节点???why?)

二、删除该节点后,将前驱或者后继复制到该节点,然后删除前驱或者后继。(以前驱为例)

前驱是黑色节点:有一个非null子节点

前驱为黑色节点,子节点都是null

前驱为红色节点,子节点都为null

红黑树节点删除总结:

1、删除的为根节点,删除时将该节点置为null

2、待删除节点左右节点都是null,删除时将该节点置为null

3、待删除节点左右节点有一个非null,删除时用有值的节点取代删除节点。

4、待删除节点左右都是非null,找到前驱或者后继,删除时用前驱或者后继取代删除节点。

删除后引起红黑树(均衡二叉树)不平衡,通过"变色""旋转"使其平衡。

 

https://blog.csdn.net/fengdongsuixin/article/details/96351133

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值