当前位置: 首页 > article >正文

红黑树的左旋右旋

文章目录

      • 红黑树旋转的基本目标:
      • 旋转的基本概念
      • 左旋(Left Rotation)的过程
      • 右旋(Right Rotation)的过程
      • 旋转操作与红黑树的平衡
        • 插入时的旋转
        • 删除时的旋转
      • 示例:左旋和右旋代码实现(Python)
        • 左旋实现(Left Rotation)
        • 右旋实现(Right Rotation)
      • 总结

在红黑树(Red-Black Tree)中,**左旋(Left Rotation) 右旋(Right Rotation)**是两种常用的操作,主要用于平衡树的结构,使其满足红黑树的平衡性质。

红黑树旋转的基本目标:

  • 保持红黑树的基本性质(包括红黑性质和二叉搜索树性质)。
  • 通过旋转操作,调整树的高度,避免树变成一条线,从而保证树的平衡。

旋转操作通常在插入和删除节点时发生,目的是保持红黑树的平衡和避免违反红黑树的性质(比如父节点和子节点之间的红色关系等)。

旋转的基本概念

  1. 左旋(Left Rotation):是围绕某个节点进行旋转,通常是将当前节点的右子节点提升为父节点,当前节点成为其左子节点。

  2. 右旋(Right Rotation):是围绕某个节点进行旋转,通常是将当前节点的左子节点提升为父节点,当前节点成为其右子节点。

左旋(Left Rotation)的过程

假设我们要围绕节点 x 进行左旋转:

        x
       / \
      a   y
         / \
        b   c
  • 旋转的目标是将 y 提升为新的根节点,x 成为 y 的左子节点,b 成为 x 的右子节点,y 的左子树仍然是 b
  • 旋转之后的树结构如下:
        y
       / \
      x   c
     / \
    a   b

左旋的步骤:

  1. y 的左子树赋值给 x 的右子树。
  2. x 的父节点指向 y,并将 y 的父节点指向 x
  3. y 设为原本 x 的父节点。

左旋通常发生在右子树较高的情况下,或者在调整红黑树平衡时需要用到。

右旋(Right Rotation)的过程

假设我们要围绕节点 y 进行右旋转:

        y
       / \
      x   c
     / \
    a   b
  • 旋转的目标是将 x 提升为新的根节点,y 成为 x 的右子节点,b 成为 y 的左子节点,x 的右子树仍然是 b
  • 旋转之后的树结构如下:
        x
       / \
      a   y
         / \
        b   c

右旋的步骤:

  1. x 的右子树赋值给 y 的左子树。
  2. y 的父节点指向 x,并将 x 的父节点指向 y
  3. x 设为原本 y 的父节点。

右旋通常发生在左子树较高的情况下,或者在调整红黑树平衡时需要用到。

旋转操作与红黑树的平衡

红黑树的插入和删除操作常常会导致树的某些性质被破坏,特别是破坏了树的平衡性。为了重新平衡树,我们使用左旋和右旋来进行局部的结构调整。具体来说,以下是插入和删除操作中常见的旋转方式:

插入时的旋转
  1. 右旋:通常发生在当插入一个节点后,发现树的左子树较高时,使用右旋将树结构进行调整。

  2. 左旋:通常发生在当插入一个节点后,发现树的右子树较高时,使用左旋将树结构进行调整。

删除时的旋转

删除节点时,尤其是删除红色节点时,可能会导致红黑树的性质被破坏,旋转操作有助于修复这些问题。

示例:左旋和右旋代码实现(Python)

左旋实现(Left Rotation)
class Node:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None
        self.parent = None

def left_rotate(root, x):
    # 左旋操作
    y = x.right
    x.right = y.left
    if y.left is not None:
        y.left.parent = x
    y.parent = x.parent
    if x.parent is None:
        root = y  # x 是根节点,y 成为新的根节点
    elif x == x.parent.left:
        x.parent.left = y
    else:
        x.parent.right = y
    y.left = x
    x.parent = y
    return root
右旋实现(Right Rotation)
def right_rotate(root, y):
    # 右旋操作
    x = y.left
    y.left = x.right
    if x.right is not None:
        x.right.parent = y
    x.parent = y.parent
    if y.parent is None:
        root = x  # y 是根节点,x 成为新的根节点
    elif y == y.parent.right:
        y.parent.right = x
    else:
        y.parent.left = x
    x.right = y
    y.parent = x
    return root

总结

  • 左旋是将当前节点的右子节点提升为父节点,并让当前节点成为其左子节点。
  • 右旋是将当前节点的左子节点提升为父节点,并让当前节点成为其右子节点。
  • 旋转操作是红黑树平衡操作的核心,插入和删除操作时常需要旋转来保持树的平衡。

旋转操作在红黑树的调整过程中非常重要,能够有效地维持树的平衡,确保树的高度保持在对数级别,从而保证查找、插入和删除操作的效率。


http://www.kler.cn/a/460645.html

相关文章:

  • WebSocket 的封装使用
  • 全国城市经纬度--包括省会(直辖市)、地级市
  • 酒店管理系统|Java|SSM|VUE| 前后端分离
  • 【C语言】可移植性陷阱与缺陷(三):整数的大小
  • Unity学习笔记(五)什么是状态机
  • 六年之约day5
  • MySQL 执行计划:优化查询性能
  • 家政预约小程序04活动管理表结构设计
  • Mac安装Jupyter和nbextensions报错问题
  • OpenStack系列第四篇:云平台基础功能与操作(Dashboard)
  • Spring 创建和管理 Bean 的原理,以及Spring 的单例模式是否线程安全?(有无状态Bean)
  • 电子电器架构 --- 智能座舱与AI结合
  • 数据仓库工具箱—读书笔记02(Kimball维度建模技术概述05、处理缓慢变化维度SCD属性)
  • 基于深度学习的医疗问诊助手
  • Postman[3] 创建Get和Post请求
  • Django中创建自增主键字段的几种方法
  • UEBA-对等组聚类
  • 数据结构与算法之动态规划: LeetCode 72. 编辑距离 (Ts版)
  • 198.213.337.打家劫舍
  • MySql find_in_set 函数
  • 数据仓库: 9- 数据仓库数据治理
  • KubeOS
  • java基于ThreadLocal实现单例模式
  • Android 系统 AlertDialog 系统层深度定制
  • 基于AT89C51单片机的可暂停八路抢答器设计
  • 试用ChatGPT的copilot编写一个程序从笔记本电脑获取语音输入和图像输入并调用开源大模型进行解析