平衡二叉树的一系列操作:删除、插入(在二叉排序树中插入新结点后,如何保持平衡)、调整平衡等等等
创始人
2024-04-30 22:47:59
0

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

  • 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.平衡二叉树的所有操作代码

平衡二叉树代码

相关内容

热门资讯

【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...