二叉查找树平衡旋转全解析,一文打通数据结构任督二脉

第一章:二叉查找树平衡旋转全解析,一文打通数据结构任督二脉

在二叉查找树(BST)中,插入与删除操作可能导致树的高度失衡,进而影响查询效率。为维持O(log n)的时间复杂度,引入了自平衡机制——通过旋转操作调整结构,典型代表即AVL树。

左旋与右旋的基本原理

旋转操作分为左旋和右旋,核心目标是降低树的高度而不破坏BST的有序性。左旋适用于右子树过重的情况,右旋则用于左子树过高。
  • 右旋:以当前节点为支点,将其左孩子提升为新根
  • 左旋:以当前节点为支点,将其右孩子提升为新根

AVL树中的四种不平衡场景

根据插入位置不同,失衡可分为四类,对应不同的旋转策略:
类型描述解决方式
LL型左子树的左子树插入对根节点执行右旋
RR型右子树的右子树插入对根节点执行左旋
LR型左子树的右子树插入先对左子树左旋,再对根右旋
RL型右子树的左子树插入先对右子树右旋,再对根左旋

右旋操作代码实现

func rotateRight(root *TreeNode) *TreeNode {
    newRoot := root.Left
    root.Left = newRoot.Right
    newRoot.Right = root
    // 更新高度(若维护height字段)
    root.height = max(height(root.Left), height(root.Right)) + 1
    newRoot.height = max(height(newRoot.Left), root.height) + 1
    return newRoot // 新的根节点
}
上述代码将根节点进行右旋,newRoot成为新的父节点,原根变为其右子节点。旋转后需重新计算节点高度以支持后续平衡判断。通过组合使用这些旋转,AVL树可在每次插入或删除后恢复平衡,确保高效检索性能。

第二章:二叉查找树的基础构建与失衡分析

2.1 二叉查找树的C语言实现原理

节点结构设计
二叉查找树(BST)的核心是节点结构,每个节点包含数据域和左右子树指针。在C语言中,使用结构体定义:
typedef struct TreeNode {
    int data;
    struct TreeNode *left;
    struct TreeNode *right;
} TreeNode;
该结构通过递归定义支持动态构建树形结构,data 存储键值,left 和 right 分别指向左、右子树。
插入操作逻辑
插入时需保持BST性质:左子树所有节点值小于根,右子树大于根。递归实现如下:
TreeNode* insert(TreeNode* root, int val) {
    if (root == NULL) {
        TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
        node->data = val;
        node->left = node->right = NULL;
        return node;
    }
    if (val < root->data)
        root->left = insert(root->left, val);
    else
        root->right = insert(root->right, val);
    return root;
}
首次调用传入根节点与待插入值,空树则创建新节点,否则根据大小关系递归至合适位置插入。

2.2 插入与删除操作中的结构变化

在动态数据结构中,插入与删除操作常引发底层存储布局的重构。以平衡二叉搜索树为例,节点的增删可能触发旋转操作以维持树高平衡。
插入导致的结构调整
当新节点插入后破坏了AVL树的平衡条件时,系统将执行单旋或双旋修正。例如:

if (balanceFactor(node) > 1 && value < node->left->value)
    return rotateRight(node); // 右旋恢复平衡
该逻辑判断左子树过高且新值位于左侧,需通过右旋重新分配父子指针。
删除后的重构策略
删除操作可能导致空洞或失衡,常见应对方式包括:
  • 用右子树最小节点替换被删节点
  • 递归更新祖先高度
  • 沿路径回溯并修复不平衡子树
结构变化的本质是维护操作的时间复杂度稳定性,确保查询性能不受频繁修改影响。

2.3 失衡判定:BF因子与高度计算

平衡因子(BF)的定义
平衡因子(Balance Factor, BF)是AVL树中每个节点的关键属性,用于衡量其左右子树的高度差异。对于任意节点,BF值等于左子树高度减去右子树高度。
  • BF = 左子树高度 - 右子树高度
  • 当 |BF| > 1 时,该节点失衡,需进行旋转调整
节点高度的递归计算
节点的高度定义为其到最远叶节点的边数。空节点高度为-1,叶子节点高度为0。
int getHeight(TreeNode* node) {
    return node ? max(getHeight(node->left), getHeight(node->right)) + 1 : -1;
}
上述代码通过递归方式计算节点高度。每次调用返回左右子树最大高度加1,空节点返回-1,确保高度差计算准确。
BF因子的实际判定示例
节点左高右高BF状态
A211平衡
B02-2失衡

2.4 典型失衡场景模拟与诊断

在分布式系统中,节点负载不均是常见问题。通过模拟流量倾斜、网络分区和资源争用等典型失衡场景,可提前暴露系统瓶颈。
流量倾斜模拟示例
// 模拟请求集中发送至特定节点
func simulateSkewedTraffic(nodes []string, skewFactor int) {
    for i := 0; i < 1000; i++ {
        target := nodes[0] // 90% 请求指向首个节点
        if rand.Intn(100) > skewFactor {
            target = nodes[rand.Intn(len(nodes))]
        }
        sendRequest(target)
    }
}
上述代码通过设定偏斜因子(skewFactor)控制请求分布,模拟热点节点场景。当 skewFactor 设置为 90 时,约 90% 的请求将集中于第一个节点,用于测试负载均衡策略的有效性。
常见失衡类型对比
场景触发条件典型表现
数据倾斜哈希分布不均某节点存储量远超其他
计算负载不均任务调度策略缺陷CPU 使用率差异显著

2.5 实战:构建可复现的失衡测试用例

在分布式系统测试中,网络分区、节点延迟和资源争用常导致难以复现的异常。构建可复现的失衡测试用例是验证系统容错能力的关键。
注入可控的失衡条件
通过工具模拟CPU压力、内存限制和网络延迟,可稳定复现极端场景。例如,使用Linux的tc命令控制网络:

# 模拟100ms延迟,丢包率5%
sudo tc qdisc add dev eth0 root netem delay 100ms loss 5%
该命令配置网络接口的排队规则,引入延迟与丢包,用于测试服务降级逻辑。
测试用例设计策略
  • 固定随机种子,确保模拟行为可重复
  • 记录初始状态与输入参数,便于回放
  • 使用容器化环境,保证运行时一致性
结合监控指标(如响应时间、错误率),可精准评估系统在失衡状态下的表现。

第三章:AVL树的四种基本旋转操作

3.1 右单旋(LL型)的理论推导与编码实现

旋转场景分析
当AVL树中某节点的左子树高度比右子树大2,且失衡节点的左孩子也是“左重”时,需执行右单旋(LL型)恢复平衡。该操作通过将左孩子上提,原节点作为其右子树来重构。
核心代码实现
TreeNode* rotateRight(TreeNode* y) {
    TreeNode* x = y->left;
    y->left = x->right;
    x->right = y;
    // 更新高度
    y->height = max(getHeight(y->left), getHeight(y->right)) + 1;
    x->height = max(getHeight(x->left), getHeight(x->right)) + 1;
    return x; // 新的子树根
}
上述函数接收失衡节点 y,将其左孩子 x 提升为新根,y 成为 x 的右子节点。旋转后需重新计算节点高度,确保后续平衡判断准确。

3.2 左单旋(RR型)的应用场景与代码验证

RR型旋转的触发条件
当AVL树的右子树高度显著大于左子树,且新节点插入到右子树的右侧时,触发左单旋(RR型)。该操作通过提升右孩子来恢复平衡。
左单旋核心代码实现
func rotateLeft(z *Node) *Node {
    x := z.right
    z.right = x.left
    x.left = z
    z.height = max(height(z.left), height(z.right)) + 1
    x.height = max(height(x.left), height(x.right)) + 1
    return x // 新的子树根节点
}
上述代码中,z为失衡节点,x为其右子。通过调整指针关系,将x上移为新根,z成为其左子,并更新高度信息。
应用场景示例
  • 连续插入递增数据导致右偏斜
  • 实时日志系统中按时间排序的节点插入
  • 需要维持O(log n)查询性能的动态集合

3.3 双旋策略:左右双旋(LR型)与右左双旋(RL型)

在AVL树中,当插入节点导致失衡且结构呈现先左后右或先右后左时,需采用双旋策略。这类情形分别称为LR型和RL型失衡。
LR型双旋处理流程
LR型失衡发生在左子树的右子树过长时。需先对左子树进行左旋,转化为LL型,再整体右旋。
RL型双旋处理流程
RL型则相反,出现在右子树的左子树过长时,先对右子树右旋,转为RR型,再整体左旋。

// 左右双旋示例:先左旋再右旋
Node* lr_rotate(Node* root) {
    root->left = left_rotate(root->left);
    return right_rotate(root);
}
上述代码中,left_rotate 调整左子树结构,使其变为可右旋的平衡形态,随后 right_rotate 恢复根节点的平衡。双旋操作确保树高差始终不超过1,维持O(log n)查询效率。

第四章:平衡维护的完整集成与性能优化

4.1 插入后自动触发平衡调整机制

在自平衡二叉搜索树中,每次插入新节点后都会触发自动平衡机制,确保树的高度始终保持在对数级别,从而保障查找、插入和删除操作的时间复杂度稳定在 O(log n)。
平衡调整的触发时机
当新节点插入后,系统会自底向上回溯路径上的每个祖先节点,检查其左右子树高度差(即平衡因子)。若某节点的平衡因子绝对值超过 1,则立即启动旋转操作进行修正。
核心旋转操作

if (balanceFactor > 1 && key < node->left->key)
    rotateRight(node); // LL 情况
else if (balanceFactor < -1 && key > node->right->key)
    rotateLeft(node);  // RR 情况
上述代码片段展示了左-左(LL)和右-右(RR)两种失衡情形的处理逻辑。rotateRight 和 rotateLeft 分别为右旋和左旋函数,用于重新分配节点父子关系,恢复平衡。
  • LL 型:左子树过重,执行右旋
  • RR 型:右子树过重,执行左旋
  • LR 型:先左旋再右旋
  • RL 型:先右旋再左旋

4.2 删除节点后的递归平衡修复

在AVL树中删除节点后,可能导致祖先节点失衡。此时需沿插入路径回溯,对每个失衡节点进行旋转修复。
平衡因子更新与旋转判断
每次删除后更新节点高度,并计算平衡因子(左子树高度减右子树高度)。若平衡因子绝对值大于1,则需旋转:
  • LL型:右旋(rotateRight)
  • RR型:左旋(rotateLeft)
  • LR型:先左旋后右旋
  • RL型:先右旋后左旋
func (n *Node) rotateRight() *Node {
    left := n.left
    n.left = left.right
    left.right = n
    n.height = max(height(n.left), height(n.right)) + 1
    left.height = max(height(left.left), n.height) + 1
    return left
}
该函数执行右旋操作,重新计算旋转后节点的高度,确保后续平衡判断正确。递归返回过程中逐层修复,保障整棵树的AVL性质。

4.3 高度更新与平衡判断的效率优化

在AVL树的操作中,频繁的高度更新和平衡因子判断会显著影响性能。为减少冗余计算,可采用惰性更新策略,仅在必要节点进行高度刷新。
优化后的高度更新逻辑
func updateHeight(node *TreeNode) {
    leftHeight := maxDepth(node.Left)
    rightHeight := maxDepth(node.Right)
    node.Height = 1 + max(leftHeight, rightHeight)
}
该函数仅在子树结构变更后调用,避免递归遍历时重复计算。通过缓存子树高度,将时间复杂度从O(n)降至O(1)均摊成本。
平衡判断的提前终止机制
  • 自底向上回溯时,一旦某节点平衡因子为0,其父节点高度不变,无需继续上浮更新;
  • 若节点旋转后子树高度不变,则停止后续路径检查。

4.4 综合测试:百万级数据下的稳定性验证

在高并发与海量数据场景下,系统稳定性必须经过严格验证。为模拟真实生产环境,我们构建了包含100万条用户行为记录的数据集,涵盖写入、查询与同步操作。
压力测试配置
  • 测试数据量:1,000,000 条
  • 并发线程数:200
  • 测试时长:持续运行 72 小时
  • 硬件环境:8核 CPU,32GB 内存,SSD 存储
关键性能指标监控
指标平均值峰值
响应延迟(ms)45120
QPS8,20010,500
CPU 使用率68%89%
异步写入优化代码

func asyncWrite(data []byte) {
    select {
    case writeQueue <- data: // 非阻塞写入队列
    default:
        log.Warn("write queue full, dropping data")
    }
}
该函数通过带缓冲的 channel 实现异步写入,避免 I/O 阻塞主线程。当队列满时进行日志告警,保障服务可用性。

第五章:从AVL到红黑树——平衡艺术的进阶之路

为何需要更灵活的平衡策略
AVL树通过严格的平衡条件确保了查询效率,但频繁的旋转操作在插入和删除场景下带来较高开销。红黑树则采用弱平衡策略,在保持对数时间复杂度的同时,显著降低调整频率,更适合动态数据集。
红黑树的核心性质
  • 每个节点是红色或黑色
  • 根节点为黑色
  • 所有叶子(nil)为黑色
  • 红色节点的子节点必须为黑色
  • 从任一节点到其每个叶子的所有路径包含相同数目的黑色节点
实际应用中的性能对比
操作AVL树红黑树
查找O(log n)O(log n)
插入平均2次旋转最多2次旋转
删除可能多次旋转最多3次旋转
Linux内核中的红黑树实践

struct rb_node my_node;
rb_link_node(&my_node, parent, &parent->rb_right);
rb_insert_color(&my_node, &my_tree);
上述代码片段展示了Linux中红黑树节点的插入流程,广泛应用于进程调度(CFS)、内存管理等子系统。
从AVL迁移至红黑树的决策建议
当应用场景以读操作为主时,AVL树更具优势; 若写操作频繁,尤其是高并发环境,红黑树能提供更稳定的性能表现。 实际开发中,STL的std::map、Java的TreeMap均基于红黑树实现,验证了其工程实用性。
Ghost卷积原理与构建YOLOv11的GhostNet变体 本文探讨了在边缘设备部署YOLOv11时使用Ghost卷积进行模型轻量化的实践经验。针对Jetson Nano的4GB内存限制,作者通过替换Backbone中的3x3标准卷积为Ghost卷积,实现了参数减少28%、推理速度提升38%,仅损失1.1%mAP的优化效果。文章详细介绍了Ghost卷积的实现原理、在YOLOv11中的具体替换策略,以及训练调参和部署优化的关键技巧。作者强调轻量化是计算效率与模型性能的权衡,建议工程团队保留原模型和Ghost变体两个版本,根据实际需求灵活切换。Ghost卷积的核心价值在 阅读详情

相关推荐

Yolov26 在 Rk3588 上的 Rknn Onnx 部署实践(模型转换)

本文详细介绍了将YOLOv26 ONNX模型转换为RKNN模型的过程,适用于RK3588平台。主要内容包括:1)量化数据集的创建,通过随机抽取最多400张JPG图片生成校准数据集;2)ONNX转RKNN的完整脚本,支持多种量化方式和平台适配;3)模型转换的参考调用方式;4)模型结构对比展示。文章还提供了注意事项,强调量化数据集图片尺寸、mean/std值需与实际推理一致,并给出精度优化建议。该转换流程为YOLOv26模型在RK3588上的高效部署提供了完整解决方案。

qq_64366203的博客 1126

二叉平衡树的旋转操作

平衡二叉树简称平衡树,是由Adelson-Velskii和Landis于1962年首先提出的,所以又称为AVL树。他的定义很简单,就是若一棵二叉树的每个左右节点的高度差最多相差1,此二叉树即是平衡二叉树。把二叉树的每个节点的左子树减去右子树定义为该节点的平衡因子。二叉平衡树的平衡因子只能是1、0或者-1。 平衡二叉树是对二叉搜索树(又称为二叉排序树)的一种改进。二叉搜索树有一个缺点就是,树的结构...

凌凌小博客 1439

Linux CentOS7文件系统(/dev/var)的容量扩充

原因是之前安装docker后,再想安装Nessus,系统说home、var文件系统的内存都不够。

JHoanna的博客 3226

【平衡二叉搜索树(AVL)-- 旋转】

打怪升级:第60天旋转是为了在保持平衡树性质的前提下降低树的高度,右子树高AVLTree,也就是我们所说的:自平衡二叉搜索树,AVL命名由来是两位发明者的名字的首字母,并无其他含义。AVL树是一棵搜索树;AVL树左右子树的高度差的绝对值不大于1;AVL树的左右子树也是AVL树。高度差可取0,1,-1。注:我们将左右子树的高度差称为平衡因子,简称为bf既然AVL树是一棵搜索树它就需要满足搜索树的特征:左子树不空,左子树上的值都小于根节点的值;右子树不空,右子树上的值都大于根节点的值;左右子树也都是二叉搜索树。

m0_熊猫馆主的博客 2876

深度学习【46】pix2pixHD

英伟达的pix2pixHD,能够合成高清的2048*1024图片,简直振奋人心。pix2pixHD是我之前介绍过的pix2pix的改进版本,使用多由粗到精的G网络和多尺度D网络(每个D网络都是用了pix2pix中同样的patch技术)。论文一开始用pix2pix尝试合成更高分辨率的图片,但发现效果不好,训练也很不稳定。所以就对pix2pix进行了一顿魔改。我们来看看他们是怎么改进的。由粗到精的G网络

DCD_LIN的博客 1万+

手把手教你用Keil5和Proteus8给51单片机跑个流水灯(附完整源码+安装包)

本文详细介绍了如何使用Keil5和Proteus8为51单片机实现流水灯效果,包括开发环境配置、汇编代码编写、电路设计及仿真调试。通过完整的源码和安装包,帮助初学者快速掌握C51单片机开发的核心流程,适合嵌入式开发入门学习。

weixin_42632434的博客 372

实现平衡二叉树(AVL树)的旋转

平衡二叉树也叫平衡二叉搜索树(Self-balancing binary search tree)又被称为 AVL 树, 可以保证查询效率较高。

qq_64431576的博客 1630

PSM倾向性评分分析介绍、spss进行倾向性评分分析示例

PSM倾向性评分分析介绍、spss进行倾向性评分分析示例

statistics+insight+vista+power 1481

二叉树的旋转,左旋和右旋

在AVLTree中经常会有以某个节点为点对子树进行旋转的操作,今天就和大家分享一下什么是二叉树的旋转。 这是一棵二叉树,上图称为图一。 将图一中的树以1为旋转点进行左旋后得到图二: 将图一中的树以1为旋转点进行右旋旋后得到图三: 将图三一节点1为旋转点点做右旋得到图四: 看了几次左旋和右旋之后相信有很多同学已经明白了什么是左旋,什么是右旋,如果还不清楚的话,请结合下面的结论再去理解上图。 左旋:旋转点的右子树(包括旋转点)成为旋转点左子树的根节点的右子树,旋转点左子树的根节点的原右子树变为原旋转点的

qq_46209845的博客 3444

手把手保姆级|Python爬取微信公众号文章完整版,反反爬策略拉满,附可运行完整代码(永久可用)

做Python爬虫的朋友都知道,爬取微信公众号文章 绝对是爬虫领域的「香饽饽」也是「硬骨头」。一方面,微信公众号的文章是极具价值的数据源:不管是自媒体从业者做竞品分析、新媒体运营者整理干货、还是个人学习收集资料,都需要批量爬取公众号文章;另一方面,微信的反爬机制堪称全网最严苛之一 ——腾讯对微信生态的风控做到了极致,动态渲染页面、高频IP封禁、Cookie短时效失效、请求头严格校验、自动化工具秒识别、频繁请求直接拉黑,这些反爬手段让90%的爬虫新手望而却步:要么爬了几篇就被封IP,要么Cookie失效爬取中

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2626

【数据集】全球大气空气柱平均甲烷(XCH₄)和一氧化碳(XCO)浓度数据集 TROPOMI/WFMD

全球大气空气柱平均甲烷(XCH₄)和一氧化碳(XCO)浓度数据集 TROPOMI/WFMD

WW、forever的博客 388

【数据结构】详解平衡二叉树AVL旋转操作(附相关C++代码)

本文介绍了什么是平衡二叉树,并详解了它的旋转操作。

weixin_50941083的博客 2251

Synopsys逻辑工艺库(DC综合)

逻辑库包括仅与综合过程有关的信息且通过DC用于设计的综合和优化。这一信息包括引脚到引脚的时序、面积、引脚类型和功耗以及其他DC需要的必须数据。逻辑库是一个文本(通常扩展名".lib"),通过使用Library Compiler(LC)编译生成带有扩展名名".db"的二进制文件。以SMIC的逻辑综合库为例:库文件下载地址。

baidu_34971492的博客 2424

红黑树原理与应用:自平衡二叉查找树的工程实践指南

在计算机科学中,数据结构是构建高效算法的基石,其中二叉查找树(BST)因其有序性和对数级操作潜力而被广泛应用。然而,BST在极端数据插入下会退化为链表,导致性能恶化。为解决这一问题,自平衡二叉查找树应运而生,它通过动态调整树结构,确保最坏情况下的操作时间复杂度稳定在O(log n)。红黑树作为自平衡二叉查找树的经典实现,其核心原理基于五条颜色规则(节点非红即黑、根节点黑、叶子节点黑、红色节点不相邻、黑高相等)和旋转变色操作,实现了“大致平衡”。这种设计在维持高效查找的同时,显著减少了插入和删除时的旋转开销,

weixin_34357436的博客 316

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java Map集合深度解析:HashMap与TreeMap原理与实战

Map是Java中最核心的数据结构之一,HashMap和TreeMap作为其典型实现,分别基于哈希表和红黑树实现。哈希表通过数组+链表+红黑树的混合结构实现O(1)时间复杂度的快速查找,而红黑树则通过自平衡特性保证最坏情况下O(log n)的稳定性能。在实际开发中,合理选择Map实现能显著提升系统性能,如高并发场景下使用ConcurrentHashMap的分段锁机制,排序需求时采用TreeMap的红黑树结构。本文深入剖析HashMap的扩容机制与TreeMap的排序原理,并给出架构设计中的Map选型策略与性

weixin_32308101的博客 194

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

平衡二叉树旋转机制

左旋是将一个节点的右子节点旋转到它的位置上,同时将该节点移到其左侧,并重新连接其子节点。右旋是将一个节点的左子节点旋转到它的位置上,同时将该节点移到其右侧,并重新连接其子节点。平衡二叉树的旋转机制是一种通过对树进行旋转操作来保持其平衡的方法。平衡二叉树的旋转机制包括两种基本类型的旋转:左旋和右旋,以及它们的组合。

qq_52146944的博客 1507

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

平衡二叉树(AVL树)

一、平衡二叉树概述 1.1 什么是平衡二叉树 平衡二叉树也叫 AVL 树。平衡二叉树是具有以下特点的二叉查找树:它是一棵空树或它的左右两个子树的高度差的绝对值不超过 1, 并且左右两个子树都是一棵平衡二叉树。 图一 平衡二叉树 图二 非平衡二叉树 1.2 为什么要有平衡二叉树 在上一篇文章 二叉排序树 中对二叉排序树做了介

Ronz 的博客 7917

平衡二叉树的旋转

平衡二叉树的旋转都是发生在最小不平衡子树上的,先看一下最简单的最小不平衡子树的形态: 其中结点C的插入导致了平衡树出现了不平衡,那怎么解决更好呢,我有一个想法,那就是把这3个结点中的中位数提到根结点。那我们先来找到中位数,因为平衡二叉树是一颗排序树,对于这4种形态的树,中位数都在固定的位置: 那么我们现在来利用简化版的左旋右旋操作将中位数提到根节点: 通过这里可以大致明白旋转的操作的意义了: 左旋B:即将父亲结点A当做自己的左孩子 右旋B:即将父亲结点A当做自己的右孩子 下面看一下复杂一点的最小

weixin_43710268的博客 4412

详细描述红黑树如何左旋、右旋(图文结合)

如下图,如果向原红黑树插入值为21的新节点,由于父节点22是红色节点,因此这种情况打破了红黑树的规则4(每个红色节点的两个子节点都是黑色),必须进行调整,使之重新符合红黑树的规则。当前结点的父亲是红色,且它的祖父结点的另一个子结点也是红色,我们要进行的是变色。把父节点和叔叔设为黑色,把祖父也就是父亲的父亲设为红色(爷爷)为了重新符合红黑树的规则,尝试把红色节点变为黑色,或者把黑色节点变为红色。旋:当前父结点是红色,叔叔是黑色的时候,且当前的结点是。旋:当前父结点是红色,叔叔是黑色的时候,且当前的结点是。

renshen4322的专栏 2642

【算法】平衡二叉搜索树的左旋和右旋

平衡二叉搜索树的左旋和右旋

hui_zai_的博客 1996

数据结构(二叉树,二叉查找树,平衡二叉树及旋转机制)

确定支点:从添加的节点开始,不断的往父节点找不平衡的点。

Janna_woo的博客 1035

二叉树旋转--左旋|右旋

二叉树旋转 二叉树的旋转主要是应用在AVL树中,当添加一个节点时候导致左右两个子树的高度差不在是-1 , 1 , 0而变成了2 或者-2。此时就需要用到左旋/右旋了。当然左右旋或者有左旋也是基于左旋和右旋的就是顺序不同,理清旋转的顺序就可以直接调用 ...

weixin_43855206的博客 2528

平衡二叉树的左旋右旋详解 看不懂你打我

平衡二叉树的左旋右旋 看不懂你打我左旋右旋的操作为什么要左旋右旋左旋右旋能保持排序二叉排序树的性质吗 左旋右旋的操作 1.左旋:对X节点左旋,即以X的右孩子Y为轴,将X节点转下来,变为Y的左孩子, 简单记为左旋即把该节点变为左孩子。 例题1.如对A左旋 注意2个问题: 1.既然要左旋要以右孩子为轴,那么右孩子是必须存在的,即不能为空。 2.左旋后B的左指针指向A,那原来B的左孩子C怎么办,谁去指向它? A原来的右指针指向B,在左旋后该怎么办,它指向谁? 所以我们将左旋后A的右指针指向B原来的左孩子C即可

yyg15的博客 1万+

数据结构中平衡二叉树插入删除中左旋、右旋、左右双旋、右左双旋的详解(题目讲解 简单易懂)

数据结构中平衡二叉树插入删除中左旋、右旋、左右双旋、右左双旋的详解(题目讲解 简单易懂)

showswoller的博客 1396

day062:平衡二叉树——左旋、右旋

左旋:指将根节点的右侧往左拉,原先的右子节点变成新的父节点,并把多余的左子节点出让,给已经降级的根节点当右子节点右旋:指将根节点的左侧往右拉,原先的左子节点变成新的父节点,并把多余的右子节点出让,给已经降级的根节点当左子节点左子树高:右旋;右子树高:左旋。

ZuoQi的博客 5536

学习:平衡二叉树的旋转机制

平衡二叉树(Balanced Binary Tree)是一种二叉树,其特点是在插入或删除节点时,通过一定的机制保持树的平衡。常见的平衡二叉树包括AVL 树和红黑树。本文主要以 AVL 树为例,讲解其工作原理和实现细节。平衡二叉树通过旋转操作保持树的平衡,从而确保操作的时间复杂度维持在 \(O(\log n)\)。四种基本的旋转操作(左左、左右、右右和右左)是维护树平衡的核心手段。理解这些旋转操作及其应用,可以帮助我们设计和实现高效的数据结构,确保在各种应用场景中提供稳定的性能。

weixin_75156045的博客 1338
上一篇: 为什么90%的C程序员都写不好字节序转换宏?真相令人震惊
下一篇: 【C语言归并排序内存优化秘籍】:揭秘高效排序中内存占用的5大陷阱与解决方案
FastCompile
博客等级 码龄1年 164粉丝 2015原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值