一、红黑树介绍
红黑树(Red-Black Tree)是一种自平衡的二叉查找树。在计算机科学中,它是用来组织具有可比较关键字的数据,如关联数组,它在1972年由鲁道夫·贝尔发明。红黑树通过确保从根到叶子的最长的可能路径不多于最短的可能路径的两倍长而近似平衡,这是通过对节点的颜色和对树结构的约束来实现的。
二、红黑树的基本性质
-
节点颜色:每个节点要么是红色,要么是黑色。
-
根节点:树的根节点是黑色的。
-
红色规则:如果一个节点是红色的,则它的子节点必须是黑色的(也就是说,两个红色节点不能连续)。
-
黑色高度:从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
-
新插入节点:新插入的节点为红色。
这些性质确保了红黑树的大致平衡,使得树的高度大约为 log(n),其中 n 是树中元素的数量。这使得红黑树上的查找、插入和删除操作的时间复杂度最坏为 O(log n)。
三、红黑树的操作
1、旋转操作介绍
首先我们在不考虑颜色的情况下进行旋转演示:
左旋转:
步骤:把Y的左子树取下,把X右子树取下,让X的右子树等于Y的左子树,Y的左子树等于X,并且让Y成为X父节点的子树,X的父节点为Y。
右旋转原理相同:
步骤:把X的右子树取下来,把Y的左子树取下来,Y的左子树等于X的右子树,X的右子树等于Y,最后连接父节点,X的父节点等于Y的父节点,Y的父节点等于X。
2、实际插入节点操作
情况一:父节点是祖父节点的左子树,并且叔父节点为红色
这种情况下,我们直接将父节点和叔父节点变为黑色,祖父节点变为红色,这时有同学可能会发现,根节点变成红色了,而我们红黑树的性质规定根节点为黑色,那么这里会有一个小技巧:定义一个黑节点并命名为nil,代表空节点,此时,我们可以让nill当根节点,并且,所有叶子节点也可以指向该节点,不会影响红黑树的性质,也解决了细节问题。
情况二:父节点是祖父节点的左子树,叔父节点是黑节点,Z节点为右子树
此时是正常的情况一,当我们变色后,Z节点变为祖父节点,且此时Z节点与Z节点的父节点为红色,叔父节点为黑色,就是我们的情况二,那我们需要旋转两次,首先进行左先转:
然后进行右旋转,并且变色:
变色:交换Z节点的父节点和祖父节点的颜色。
情况三:父节点是祖父节点的左子树,叔父节点为黑色,Z节点是父节点的左子树
这种情况下只需要进行一次旋转加变色即可:
父节点是祖父节点的右子树的情况同理,也是类似的操作,同侧则旋转一次变色一次,不同侧则旋转两次变色一次。