JavaScript 平衡二叉搜索树 (AVL, Red-Black Tree)

平衡二叉搜索树概述

平衡二叉搜索树是一种特殊的二叉搜索树,其特点是在插入或删除节点时能自动保持树的高度最小化。这使得它在执行各种操作时都能保持较低的时间复杂度。常见的平衡二叉搜索树包括 AVL 树和红黑树。

AVL 树

AVL 树是一种高度平衡的二叉搜索树,它的特点是每个节点的左右子树的高度差不超过 1。为了保持这种平衡,AVL 树在插入或删除节点后会进行旋转操作。

插入操作

当向 AVL 树中插入一个新节点时,需要检查树是否仍然平衡,并在必要时进行旋转操作以恢复平衡。插入操作可以分为以下步骤:

  1. 找到插入位置:按照二叉搜索树的规则找到插入新节点的位置。
  2. 插入节点:将新节点插入到找到的位置。
  3. 更新节点高度:从插入节点向上更新所有祖先节点的高度。
  4. 检查平衡:从插入节点向上检查每棵子树的平衡状态,如果发现不平衡,则进行相应的旋转操作。
单旋转操作

单旋转操作包括左旋和右旋两种类型,它们用于调整树的结构以恢复平衡。

  • 左旋:当右子树过高时,进行左旋操作。
  • 右旋:当左子树过高时,进行右旋操作。
双旋转操作

双旋转操作是结合了两次单旋转操作的复合操作,用于更复杂的不平衡情况。

  • 先左后右旋:当不平衡出现在右子树的左子节点上时使用。
  • 先右后左旋:当不平衡出现在左子树的右子节点上时使用。

删除操作

删除节点的操作与插入类似,需要找到待删除节点并删除它,然后重新调整树的结构以保持平衡。

  1. 找到删除节点:按照二叉搜索树的规则找到待删除节点。
  2. 删除节点:根据节点的子节点数量决定如何删除节点。
  3. 更新节点高度:从删除节点向上更新所有祖先节点的高度。
  4. 检查平衡:从删除节点向上检查每棵子树的平衡状态,如果发现不平衡,则进行相应的旋转操作。

红黑树

红黑树是一种自平衡的二叉搜索树,它的特点是通过为每个节点添加一个颜色属性(红色或黑色)来确保树的大致平衡。红黑树的性质如下:

  1. 每个节点要么是红色,要么是黑色。
  2. 根节点是黑色。
  3. 每个叶子节点(NIL 节点,空节点)是黑色。
  4. 如果一个节点是红色的,则它的两个子节点都是黑色的。
  5. 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。

插入操作

红黑树的插入操作需要保证插入后的树仍满足红黑树的性质。具体步骤如下:

  1. 插入节点:将新节点作为普通二叉搜索树的节点插入。
  2. 着色:将新插入的节点着为红色。
  3. 调整:通过一系列重新着色和旋转操作来恢复红黑树的性质。
重新着色

重新着色是指将某些节点的颜色从红色改为黑色或将黑色改为红色,以确保红黑树的性质不被破坏。

旋转操作

红黑树中的旋转操作与 AVL 树类似,包括左旋和右旋,但它们的触发条件和实现细节略有不同。

删除操作

红黑树的删除操作也类似于二叉搜索树的删除操作,但在删除节点后需要进行一些调整以确保树的性质不被破坏。

  1. 找到删除节点:按照二叉搜索树的规则找到待删除节点。
  2. 删除节点:根据节点的子节点数量决定如何删除节点。
  3. 调整:通过重新着色和旋转操作来恢复红黑树的性质。

总结

AVL 树和红黑树都是平衡二叉搜索树的重要实现方式,它们各有优缺点。AVL 树的平衡性更好,查找效率更高,但插入和删除操作可能需要更多的旋转操作。红黑树的平衡性稍逊于 AVL 树,但插入和删除操作更高效,且实现相对简单。在实际应用中,可以根据具体需求选择合适的平衡二叉搜索树。

纠错
反馈