当前位置: 首页 > 网络应用技术

带给您常用的AVL树以及红色和黑树的奥秘(规则)

时间:2023-03-07 10:42:15 网络应用技术

  AVL树称为平衡的二进制树。因为在生成BST树的过程中可能会出现线型树结构,例如插入顺序为:1、2、3、4、5、6、7。..,n。

  定义:它是空树或左右树的左右树之间高度差的绝对值,左右的两个子树是平衡的二进制树。

  在BST树中,理想的条件是每个子树的左子树和右子树相等。目前,搜索的时间复杂性是日志(n)。

  但是,一旦这棵树演变成线型树,就不存在理想情况。在这个时间上,这个结果。

  我们现在要做的是让BST在创建过程中不开发成型树。该方法是在添加新节点时保持树的平衡。

  节点平衡有这样的定义:它是一个空树的绝对值或其左右子树的绝对值不超过1,左右子树是一个平衡的二进制树。此处提到的高度差异是我们将在下面介绍的平衡因素:BF(平衡因素)。

  因为AVL树仍然是二进制树,所以只有两个子节点。节点失衡的发生是因为有一个新的节点插入。这种新插入的节点导致某些节点的左右节点的高度。因此,我们可以列举以下四种情况的不平衡。

  原始A的左子B成为父节点,A成为其右子,而原始B的右子树成为A的左子树。请注意,旋转后,D是左子 -A.

  目前,您只需要将树向左旋转一次即可。如图所示,原始的A右子B变成了父结,A变成了其左子女,原始B的左子树将成为A.Sub -Tree的右侧。

  摘要:LR需要旋转两次。只有一次的旋转是无法再次平衡二进制树。如图所示,在B节在根据RR类型向左旋转后,二进制树在A节点中仍然无法平衡。目前,它需要再次向右旋转。

  在二进制二进制树的左子树上插入了一个新节点,因此该节点不再平衡。类似地,您需要此时旋转两次,而旋转方向与LR类型相反。

  从上面的节点的解释以及插图。我认为您已经遇到了旋转操作。是对称的。

  红树和黑树是一棵非常有趣的平衡检索树。它的统计性能比平衡的二进制树更好(有些书称为作者的名字Adelson-velskii和Landis,称为AVL-Trees,因此在其中应用了红色和黑色树木许多地方。在C ++ STL中,许多零件(目前包括集合,多层,地图,多映射)。操作的支持)。

  之所以被称为红树和黑树的原因是其每个节点都是“颜色”红色或黑色的。这些节点用于检测树的平衡。平衡的二进制树。相反,红树和黑树放松了平衡二进制树的要求。由于一定极限的“失衡”,红树的性能得到了改善。

  从根节点到叶节点的黑色节点的数量称为树的“黑色高度”。红树的性质确保了从根节点到叶节点的路径的长度不会超过两倍其他路径。

  考虑一棵黑色和黑色的树,黑色高度为3:从根节点到叶子节点的最短路径显然是2(黑色黑色),最长的路径为4(黑色红色 - 红色黑色 - 黑色,-Black Blackto。

  不可能在最长的路径中添加更多黑色节点。红色节点的子节点必须是黑色的,因此在相同的简单路径中有两个连续的红色节点。总而言之,我们可以构建的最长路径将是红色和黑色交替的路径。

  我们可以得出结论,对于给定的黑色高度为n的红树,从根到叶子节点的简单路径的最小长度为n-1,最大长度为2(n-1)。

  在插入和删除操作中,可以旋转节点以保持树的平衡。红树的平均和最差搜索时间为o(log2 n)。红树和黑树的统计表现比平衡的二进制树更好,但是极端性能稍差。

  在红树和黑树中插入节点的过程

  插入节点的过程是:

  请注意,节点节点与空指针不同。在简单的实现中,您可以使用“监视哨声”和黑色公共节点,标记为黑色,如前所述的空节点。

  在红色节点上添加两个空子节点以满足自然4.同时,红色节点的两个子节点必须是黑色的(根据大自然3)。,插入红色子节点将违反定义。目前有两种情况。

  红色父亲节点的兄弟节点也是红色

  简单地恢复上级节点将解决冲突。节点B重新颜色后,应重新检查树节点的颜色,以确保整个树满足定义要求。成为黑色。如果最初是红色的,那么红树的黑色高度将增加1。

  红色父亲节点的兄弟节点是黑色的

  这种情况更加复杂。

  re-节点会将节点变成黑色,因此树的平衡将被破坏,因为左树的黑色高度会增加,右树的黑色高度不会相应地变化。如果我们与节点b一起红色,左右子树的高度将降低,树木仍然不平衡。这次,节点C的着色继续导致较差的情况。左子树的黑色高度增加,右树的黑色高度减少了。为了解决问题,有必要旋转并重新颜色树节点。这次,算法将正常结束,因为子树的根节点(a)被涂成黑色,与此同时,将不会引入新的红色冲突。

  结束插入过程

  插入节点时,您可能需要变色或旋转以保持红色和黑色树的性质。如果旋转完成,则算法已经结束。对于颜色,我们将在根上留下红色节点subtree,因此我们需要继续修理树以维持红色和黑树的性质。在最坏的情况下,我们将不得不处理树根的所有路径。插入时间的复杂性是o(log2 n)。删除节点的时间复杂性与此相似。

  删除节点

  删除红色和黑树的节点比插入更为复杂。我们可以将实际的删除操作分为三种情况(不首先讨论颜色)。其中,已删除的节点标有紫色,表明任意颜色的节点可能是红色或黑色:

  情况A:删除的节点没有子节点(两个子节点都是空节点)

  最初属于x的节点是由删除的节点“继承”的。如果已删除的节点是黑色节点,则树的黑度可能会改变。

  案例B:有一个子节点

  b节点替换了原始X节点的位置。如果删除的节点是黑色节点,则树的黑色高度可能会改变;如果B是红色节点,则可能需要丰富多彩。

  案例C:有两个子节点

  这种情况更加复杂。您需要在X的钥匙值及其左子树中交换最大节点。这通常会导致重新颜色,树的黑色高度的变化以及随后的旋转。

  应该注意的是,删除节点是不够的,因为从那时起可能可以重新颜色树。树的高度;如果删除了黑色节点,则情况不会那么简单。受影响的节点(移动或交换)标记为黑色。如果它已经是黑色的,则需要标记为“双黑”(双黑色或双块。简单地标记为“双黑色”意味着它需要“抹黑”周围的红色节点)。

  “双黑”节点显然不符合红树的要求,因此必须消除这一点。“双黑”的情况可以分为4种类型:

  1.双黑节点的兄弟的节点是红色

  2.双黑节点的兄弟是黑色,其兄弟有两个黑色子节点

  3.双黑节点的兄弟是黑色的,其兄弟的左右节点分别为红色和黑色。

  4.双黑节点的兄弟是黑色的,其兄弟的正确节点是红色

  显然,以上四种情况包括所有可能的条件。

  处理双黑节点的基本思想是执行“色彩补偿”。换句话说,相邻的红节点变成黑色,同时,这对黑色节点也被“恢复”成黑色。

  红树和黑树介绍了“颜色”的概念。引入“颜色”的目的是简化红色和黑色树的平衡。正如著名的密码学专家布鲁斯·施尼耶(Bruce Schneier)所说,“部分平衡可以是好的,可以是红色的”黑树不追求“完全平衡” - 仅需要部分满足余额要求,从而减少旋转旋转要求的要求,从而提高性能。

  红树和黑树可以搜索,插入和删除O(log2 n)的时间复杂性。此外,由于其设计,任何不平衡都将在三个旋转中解决。数据结构可以在一个步骤中达到平衡,但是红树和黑树可以给我们一个相对“便宜”的解决方案。红树的算法的时间复杂性与AVL的时间相同,但是统计性能高于AVL树。

  当然,红树和黑树不符合所有应用树的区域。如果数据基本上是静态的,那么他们在不影响平衡的情况下保持其性能更好。如果数据完全静态,例如,当制作哈希表,性能可能会更好。

  例如,在实际系统中,需要与动态规则一起使用的防火墙系统来使用红树和黑树,而不是散射的列表来证明其具有更好的可伸缩性。