平衡二叉树的一系列操作:删除、插入(在二叉排序树中插入新结点后,如何保持平衡)、调整平衡等等等

news2024/11/25 0:36:26

平衡二叉树的插入(在二叉排序树中插入新结点后,如何保持平衡)

  • 1.平衡二叉树的定义
  • 2.平衡二叉树的插入(调整最小不平衡子树A)
    • 2.1LL(在A的左孩子的左子树中插入导致不平衡)
    • 2.2RR(在A的右孩子的左子树中插入导致不平衡)
    • 2.3LR(在A的左孩子的右子树中插入导致不平衡)
    • 2.4RL(在A的右孩子的左子树中插入导致不平衡)
  • 3.平衡二叉树的所有操作代码

1.平衡二叉树的定义

平衡二叉树(Balanced Binary Tree),简称平衡树(AVL树):树上任一结点的左子树和右子树的高度之差不超过1。
结点的平衡因子=右子树高-左子树高。
平衡二叉树结点的平衡因子的值只可能是−1、0或1。

在这里插入图片描述
在这里插入图片描述
只要有任一结点的平衡因子绝对值大于1,就不是平衡二叉树。

2.平衡二叉树的插入(调整最小不平衡子树A)

在二叉排序树中插入新结点后,如何保持平衡?
查找路径上的所有结点都有可能受到影响。
从插入点往回找到第一个不平衡结点,调整以该结点为根的子树。
每次调整的对象都是“最小不平衡子树”

2.1LL(在A的左孩子的左子树中插入导致不平衡)

在这里插入图片描述

LL平衡旋转(右单旋转)。
由于在结点A的左孩子(L)的左子树(L)上插入了新结点,A的平衡因子由1增至2,导致以A为根的子树失去平衡,需要一次向右的旋转操作。
总结为如下三步:
①newroot指向B
②A结点向右下旋转成为B的右子树的根结点,而B的原右子树则作为A结点的左子树
③A的左孩子B向右上旋转代替A成为根结点
//右单旋转
AVLNode* AVLTree::RotateRight(AVLNode* ptr)
{
//1.
    AVLNode* newroot = ptr->leftchild;
    newroot->parent = ptr->parent;
//2.
    ptr->leftchild = newroot->rightchild;
    if (newroot->rightchild)
    {
        newroot->rightchild->parent = ptr;
    }
    newroot->rightchild = ptr;

    AVLNode* parent = ptr->parent;
    if (parent == nullptr)
    {
        root = newroot;
    }
    else
    {
        if (parent->leftchild == ptr)
        {
            parent->leftchild = newroot;
        }
        else
        {
            parent->rightchild = newroot;
        }
    }
//3.
    ptr->parent = newroot;

    return newroot;
}

2.2RR(在A的右孩子的左子树中插入导致不平衡)

在这里插入图片描述

RR平衡旋转(左单旋转)。由于在结点A的右孩子(R)的右子树(R)上插入了新结点,A的平衡因子由-1减至-2,导致以A为根的子树失去平衡,需要一次向左的旋转操作。
具体操作步骤总结如下:
①newroot指向B
②将A结点向左下旋转成为B的左子树的根结点,而B的原左子树则作为A结点的右子树
③将A的右孩子B向左上旋转代替A成为根结点,
//左单旋转
AVLNode* AVLTree::RotateLeft(AVLNode* ptr)
{
    //1.
    AVLNode* newroot = ptr->rightchild;
    newroot->parent = ptr->parent;

    //2.
    ptr->rightchild = newroot->leftchild;
    if (newroot->leftchild != nullptr)
    {
        newroot->leftchild->parent = ptr;
    }
    newroot->leftchild = ptr;

    //考虑ptr不为根的情况
    AVLNode* parent = ptr->parent;
    if (parent == nullptr)
    {
        root = newroot;
    }
    else
    {
        if (parent->leftchild == ptr)
        {
            parent->leftchild = newroot;
        }
        else
        {
            parent->rightchild = newroot;
        }
    }
    //3.
    ptr->parent = newroot;

    return newroot;
}

2.3LR(在A的左孩子的右子树中插入导致不平衡)

在这里插入图片描述
LR平衡旋转(先左后右双旋转)。由于在A的左孩子(L)的右子树(R)上插入新结点,A的平衡因子由1增至2,导致以A为根的子树失去平衡,需要进行两次旋转操作,先左旋转后右旋转。先将A结点的左孩子B的右子树的根结点C向左上旋转提升到B结点的位置,然后再把该C结点向右上旋转提升到A结点的位置。
在这里插入图片描述

2.4RL(在A的右孩子的左子树中插入导致不平衡)

在这里插入图片描述

RL平衡旋转(先右后左双旋转)。由于在A的右孩子(R)的左子树(L)上插入新结点,A的平衡因子由-1减至-2,导致以A为根的子树失去平衡,需要进行两次旋转操作,先右旋转后左旋转。先将A结点的右孩子B的左子树的根结点C向右上旋转提升到B结点的位置,然后再把该C结点向左上旋转提升到A结点的位置。
在这里插入图片描述

3.平衡二叉树的所有操作代码

平衡二叉树代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/114620.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

qt嵌入并运行外部exe

由于项目需要,要实现将一个外部exe运行在qt的窗口中。下面记录一下过程: 首先就是在qt中创建一个新项目 由于我这里没有用到画布,所以没有勾选Generate form 然后就会自动生成一个可运行的代码 然后将我下边的代码替换粘贴进去 #includ…

RabbitMQ 第二天 高级 7 RabbitMQ 高级特性 7.5 死信队列

RabbitMQ 【黑马程序员RabbitMQ全套教程,rabbitmq消息中间件到实战】 文章目录RabbitMQ第二天 高级7 RabbitMQ 高级特性7.5 死信队列7.5.1 死信队列概述7.5.2 代码实现7.5.3 小结第二天 高级 7 RabbitMQ 高级特性 7.5 死信队列 7.5.1 死信队列概述 死信队列&am…

[LeetCode周赛复盘] 第 325 场周赛20221225

[LeetCode周赛复盘] 第 325 场周赛20221225 一、本周周赛总结二、 [Easy] 6269. 到目标字符串的最短距离1. 题目描述2. 思路分析3. 代码实现三、[Medium] 6270. 每种字符至少取 K 个1. 题目描述2. 思路分析3. 代码实现四、[Medium] 6271. 礼盒的最大甜蜜度1. 题目描述2. 思路分…

<Linux线程同步>——《Linux》

目录 1. Linux线程同步 1.1条件变量 1.2同步概念与竞态条件 1.3条件变量函数 1.4 为什么pthread_ cond_ wait 需要互斥量? 1.5 条件变量使用规范 后记:●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇&am…

论文阅读技巧

文献阅读思维 为什么你花了大量的时间来看文献却没有收获?那是因为你漫无目的的看文献,能有什么收获?所以我们要带着两个问题有目的的阅读文献。这个目的是什么?就是为了给自己找创新思路。同时在看摘要的时候你问自己第一个问题…

Mac (M1)搭建QGC地面站环境

之前朋友介绍了一个活,刚开始以为是针对树莓派进行二次开发。到了之后才发现,全新的领域,抱着试一试的想法就蛮答应了下来。后来在搭建环境的过程了一路受挫,不过就在写此文前几分钟,终于看到了成功的标志,…

2022年春秋杯网络安全联赛-冬季赛RE部分题解

easy_python python字节码 逻辑整理后就给flag flag [204, 141, 44, 236, 111, 140, 140, 76, 44, 172, 7, 7, 39, 165, 70, 7, 39, 166, 165, 134, 134, 140, 204, 165, 7, 39, 230, 140, 165, 70, 44, 172, 102, 6, 140, 204, 230, 230, 76, 198, 38, 175] for i in rang…

C++进阶(一)C++新特性:智能指针、右值引用、lambda、多线程操作、function和bind、可变模板参数

layout: post title: C进阶(一)C新特性:智能指针、右值引用、lambda、多线程操作、function和bind、可变模板参数 description: C进阶(一)C新特性:智能指针、右值引用、lambda、多线程操作、function和bind…

圣诞节来啦,快把这个动态爱心送个那个TA

作者主页:Designer 小郑 作者简介:Java全栈软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue、SpringBoot和微信小程序)、系统定制、远程技术指导。CSDN学院、蓝桥云…

_15LeetCode代码随想录算法训练营第十五天-C++二叉树

_15LeetCode代码随想录算法训练营第十五天-C二叉树 题目列表 110.平衡二叉树257.二叉树的所有路径404.左叶子之和 110.平衡二叉树 题目 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每…

雪花算法和uuid比较

1. 雪花算法 ​ 现在的服务基本是分布式、微服务形式的,而且大数据量也导致分库分表的产生,对于水平分表就需要保证表中 id 的全局唯一性。对于 MySQL 而言,一个表中的主键 id 一般使用自增的方式,但是如果进行水平分表之后&…

结构体(10)

目录 1、结构体的声明 1、结构体的声明 2、结构体变量的定义和初始化 2、结构体成员的访问 3、结构体传参 1、结构体的声明 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1、结构体的声明 例如:描述一个学生 注…

KOOM线上APM监控最全剖析

APM,全称是Application Performance Management,也就是应用性能管理,这与我们平时写的业务可能并不相关,但是却承载着App线上稳定的责任。当一款App发布到线上之后,不同的用户有不同场景,一旦App出现了问题…

【云原生系列CKA备考】新建虚拟机安装Ubuntu20.04系统

目录一、环境准备二 、安装虚拟机设置网络其他操作手册:安装 kubeadm 一台兼容的 Linux 主机(或者云主机)。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令。 每台机器 2 GB 或更多的 RAM(如果…

数据库,计算机网络、操作系统刷题笔记18

数据库,计算机网络、操作系统刷题笔记18 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle…

红中私教:计网那点事(1)

前言 🍀作者简介:被吉师散养、喜欢前端、学过后端、练过CTF、玩过DOS、不喜欢java的不知名学生。 🍁个人主页:红中 🍂专栏地址:网安专栏 光明神已陨落,现在 由计网引领我 破戒了,本来…

前端开发:Vue封装通过API调用的组件的方法

前言 在前端开发中,关于Vue的使用相比大家并不陌生,而且Vue框架的优势也是其他框架所不能比的,尤其是Vue的封装思想更是堪称一绝,还有就是组件化的运用实践过程也是亮点。所以关于Vue框架的使用想必看官都不陌生,而且常…

TCP 的主要特点(计算机网络-运输层)

目录 传输控制协议(Transmission Control Protocol,TCP) TCP 连接与面向字节流的概念 TCP 的连接 UDP与TCP复用的区别 传输控制协议(Transmission Control Protocol,TCP) TCP 是面向连接的运输层协议 …

【算术】数据结构

MySQL性能优化1、数据结构前言2、常见的数据结构2.1 线性表2.1.1 数组2.1.2 链表2.1.3 栈2.1.4 队列2.2 散列表2.3 树2.3.1 二叉树2.4 图1、数据结构前言 数据结构(data structure)是计算机存储、组织数据的方式。是指相互之间存在一种或多种特定关系的数据元素的集合&#xff…

【工作流Activiti7】6、Activiti 7 源码学习

1. 启动分析 源码版本是 7.1.0.M6 首先从 ProcessEngineAutoConfiguration 开始 ProcessEngineAutoConfiguration 是activiti-spring-boot-starter 7.1.0.M6自动配置的入口类,在这里主要看 SpringProcessEngineConfiguration 主要是配置了自动部署 最最最重要的…