红黑树模拟软件_红黑树

本文介绍了红黑树作为平衡二叉树的一种,详细解析了其特性,并通过实例展示了红黑树节点插入后的变色与旋转操作,讨论了在Java中的应用如TreeMap和优化后的HashMap。
摘要由CSDN通过智能技术生成

红黑树

发布时间:2018-08-10 15:12,

浏览次数:415

一、在理解红黑树之前,先看一些二叉查找树

二叉查找树特性:左字数上所有的节点的值都小于或等于他的根节点上的值

右子树上所有节点的值均大于或等于他的根节点的值

左、右子树也跟别为平衡二叉树

举个二叉树的例子:

可以看到如果要查询10的话,10>9

因此到他的右子树,右子树根节点为13,10<13

因此到其左子树,左子树根节点为11>10

到其左子树,为10,找到相应的节点

不过二叉查找树有一些问题,可能会出现不平横的情况,即如下图所示的情况

从这种情况可以看出,明显存在左子树和右子树深度相差过多,在使用平衡情况下的二叉查找树是时间复杂度为logn,而出现这种极端情况的话,想要查9的位置就需要每一次都遍历下一个右子树,很有可能时间复杂度变为n(与数组普通查询的时间复杂度相同)

基于上述情况,引入了平衡二叉树,红黑树即为平衡二叉树的一种

二、红黑树

特性:节点是红色或黑色

根节点一定是黑色

每个叶节点都是黑色的空节点(NIL节点)

每个红节点的两个子节点都是黑色的(从每个叶子到跟的所有路径上不能有两个连续的红节点)(即对于层来说除了NIL节点,红黑节点是交替的,第一层是黑节点那么其下一层肯定都是红节点,反之一样)

从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点

正是由于这些原因使得红黑树是一个平衡二叉树

红黑树的例子

向红黑树中插入节点14(一般默认插入节点是红色的)

在原树上插入20

可以看到,插入以后树已经不是一个平衡的二叉树,而且并不满足红黑树的要求,因为20和21均为红色,这种情况下就需要对红黑树进行变色,21需要变为黑色,22就会变成红色,如果22变成红色,则需要17和25都变成黑色

而17变成黑色显然是不成立的,因为如果17变为黑色,那么13就会变为红色,不满足二叉树的规则,因此此处需要进行另一个操作---------左旋操作

左旋:下图就是一个左旋的例子,一般情况下,如果左子树深度过深,那么便需要进行左旋操作以保证左右子树深度差变小

对于上图由于右子树中17变为黑色以后需要把13变成红色,因此进行一次左旋,将17放在根节点,这样既可保证13为红色,左旋后结果

而后根据红黑树的要求进行颜色的修改

进行左旋后,发现从根节点17,到1左子树的叶子节点经过了两个黑节点,而到6的左叶子节点或者右叶子节点要经历3个黑节点,很显然也不满足红黑树,因此还需要进行下一步操作,需要进行右旋操作

右旋:与左旋正好相反

由于是从13节点出现的不平衡,因此对13节点进行右旋,得到结果

而后再对其节点进行变色,得到结果

这便是红黑树的一个变换,它主要用途有很多,例如java中的TreeMap以及JDK1.8以后的HashMap在当个节点中链表长度大于8时都会用到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值