平衡二叉树AVL的基本操作之插入

本题要求统计给定整数M和N区间内素数的个数并对它们求和。--大一C语言萌新 C语言数丨PTA丨7-12 #include<stdio.h> int main() { int M,N,n,a; int ge=0,he=0; scanf("%d %d",&M,&N); if(M1) M++; for(n=M;n<=N;n++) { a=2; while(n%a!=0) { a++; } if(an) { ge++; he+=a; } } printf("%d %d",ge,he); return 0; } 阅读详情

        平衡二叉树或是一棵空树,或是具有下列性质的二叉排序树:其左子树和右子树都是平衡二叉树,而且左右子树深度之差绝对值不超过1. 由此引出了平衡因子(balance factor)的概念,bf定义为该结点的左子树的深度减去右子树的深度(有些书是右子树深度减去左子树深度,我是按照左子树减去右子树来计算的,下面的代码也是这样定义的),所以平衡二叉树的结点的平衡因子只可能是 -1,0,1 ,某个结点的平衡因子绝对值大于1,该二叉树就不平衡。

        平衡二叉树在出现不平衡状态的时候,要进行平衡旋转处理,有四种平衡旋转处理(单向右旋处理,单向左旋处理,双向旋转(先左后右)处理,双向旋转(先右后左)处理),归根到底是两种(单向左旋处理和单向右旋处理)。

下面是四种旋转的示意图:


图1 LL旋转 和 RR旋转


图2  LR旋转


图3 LR旋转和LL旋转



图4  RL旋转


图5  LR旋转

        这四种旋转可以归纳为两类:LL旋转和LR旋转可以归为左旋转,RR旋转和RL旋转归为右旋转。

类型定义:

typedef struct AVLNode * AVLTree;

typedef struct AVLNode{
	int data;
	short int bf;
	AVLTree lchild,rchild;
}AVLNode;
左旋函数:

void leftRotate(AVLTree *root,bool *unbalanced)
{
	AVLTree child,gchild;//gchild : grand child
	child = (*root)->lchild;
	if (child->bf == 1) {
		/* LL rotation */
		(*root)->lchild = child->rchild;
		child->rchild = *root;
		(*root)->bf = 0;
		(*root) = child;
	}
	else {
		/* LR rotation */
		gchild = child->rchild;
		child->rchild = gchild->lchild;
		gchild->lchild = child;
		(*root)->lchild = gchild->rchild;
		gchild->rchild = *root;
		switch (gchild->bf) {
			case 1:		(*root)->bf = -1;
						child->bf = 0;
						break;
			case 0:		(*root)->bf = child->bf = 0;
		 				break;
		 	case -1:	(*root)->bf = 0;
		 				child->bf = 1;
		}
		*root = gchild;	
		
	}
	(*root)->bf = 0;
	*unbalanced = false;
} 

右旋函数:

void rightRotate(AVLTree *root, bool *unbalanced)
{
	AVLTree child,gchild;/*gchild : grand child*/ 
	child = (*root)->rchild;
	if (child->bf == -1) {
		/* RR rotation */
		(*root)->rchild = child->lchild;
		child->lchild = *root;
		(*root)->bf = 0;
		(*root) = child;
	}
	else {
		/* RL rotation */
		gchild = child->lchild;
		child->lchild = gchild->rchild;
		gchild->rchild = child;
		(*root)->rchild = gchild->lchild;
		gchild->lchild = *root;
		switch (gchild->bf) {
			case -1:	(*root)->bf = 1;
						child->bf = 0;
						break;
			case 0:		(*root)->bf = child->bf = 0;
		 				break;
		 	case 1:		(*root)->bf = 0;
		 				child->bf = -1;
		}
		*root = gchild;	
		
	}
	(*root)->bf = 0;
	*unbalanced = false;
}

AVL树的插入函数:


void AVLInsert(AVLTree *root, int x, bool *unbalanced)
{
	if(*root == NULL){
		/* insert into a null tree */
		*unbalanced = true;
		*root = new AVLNode;
		(*root)->lchild = (*root)->rchild = NULL;
		(*root)->bf = 0;
		(*root)->data = x;
	}
	else if (x < (*root)->data) {
		AVLInsert(&((*root)->lchild),x,unbalanced);
		if (*unbalanced)
		/* left branch has grown higher */
			switch ((*root)->bf) {
				case -1: 	(*root)->bf = 0;
							*unbalanced  = false;
							break;
				case 0: 	(*root)->bf = 1;
							break;
				case 1:		leftRotate(root,unbalanced);
			}
	}
	else if (x > (*root)->data) {
		AVLInsert(&((*root)->rchild), x, unbalanced);
		if (*unbalanced)
		/* right branch has grown higher */
			switch ((*root)->bf){
				case 1: 	(*root)->bf = 0;
							*unbalanced = false;
							break;
				case 0:		(*root)->bf = -1;
							break;
				case -1:	rightRotate(root,unbalanced);
			} 
	}
	else {
		*unbalanced = false;
		cout<<"Node x = "<<x<<" is alreay in the tree."<<endl;
	}
}


测试结果:

从0到9到插入结果

 0
---------------------cut---------------------
   0  
     \
     1
---------------------cut---------------------
   1  
 /   \
 0   2
---------------------cut---------------------
       1      
     /   \    
   0       2  
             \
             3
---------------------cut---------------------
       1      
     /   \    
   0       3  
         /   \
         2   4
---------------------cut---------------------
       3      
     /   \    
   1       4  
 /   \       \
 0   2       5
---------------------cut---------------------
       3      
     /   \    
   1       5  
 /   \   /   \
 0   2   4   6
---------------------cut---------------------
               3              
             /   \            
       1               5      
     /   \           /   \    
   0       2       4       6  
                             \
                             7
---------------------cut---------------------
               3              
             /   \            
       1               5      
     /   \           /   \    
   0       2       4       7  
                         /   \
                         6   8
---------------------cut---------------------
               3              
             /   \            
       1               7      
     /   \           /   \    
   0       2       5       8  
                 /   \       \
                 4   6       9
---------------------cut---------------------

REF:

1,http://blog.youkuaiyun.com/jkay_wong/article/details/6676488

2,数据结构(C语言版) Ellis Horowitz



平衡二叉树的基本操作(AVL树+插入+查找) 题目链接:平衡二叉树的基本操作 考查知识:AVL树+插入+查找 题意描述: 共有n个整数和k次查询,用给定的n个整数进行建树,然后k次查询给定权值的结点是否在AVL树中 具体代码#include<bits/stdc++.h> using namespace std; const int N=1e3; int a[N]; struct TreeNode{ int val; TreeNode* left; TreeNode* right; TreeNode(i. 阅读详情

相关推荐

《画解数据结构》二十五彩图,画解平衡二叉树

为什么叫平衡二叉树?而不叫二叉平衡树呢?

英雄哪里出来 3万+

【PTA】【数据结构与算法】AVL树

判断题 1.Insert 1, 2, 3, 4, 5, and 6 one by one into an initially empty AVL tree. Then the preorder traversal sequence of the resulting tree must be {4, 2, 1, 3, 5, 6}. (2分) T F 解析:以下演示了插入的过程,最后旋转.........

葑鈊丶 1万+

从电商平台到微信私域:构建合规跳转链路的技术实现

在互联网营销与用户增长领域,链接跳转是连接不同平台、引导用户流量的基础技术。其核心原理是通过服务器端路由与参数解析,实现用户请求的接收、处理与重定向。这项技术的价值在于能够突破平台间的生态壁垒,实现流量的合规、可控迁移,尤其适用于跨平台营销、私域沉淀等场景。在实际应用中,常需处理微信环境限制、参数传递与动态内容生成等挑战。本文聚焦于电商平台(如淘宝)到微信生态的跳转需求,详细阐述了如何利用Node.js、Express框架及二维码生成技术,构建一个包含环境检测、参数传递与动态落地页的完整跳转系统,以解决微信

weixin_33889665的博客 323

单选题130

2-1 为解决计算机主机与打印机之间速度不匹配问题,通常设置一个打印数据缓冲区,主机将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中取出数据。该缓冲区的逻辑结构应该是? (1分) A. 堆栈 B. 队列 C. 树 D. 图 作者 DS课程组 单位 浙江大学 2-2 若已知一队列用单向链表表示,该单向链表的当前状态(含3个对象)是:1->2->3,其中x->y表示x的下一节点是y。此时,如果将对象4入队,然后队列头的对象出队,则单向链表的状态是:

大家一起入坑 5568

跨平台烧录实战:RKDevTool在Windows/Linux/MacOS下的统一与差异

本文详细解析了RKDevTool在Windows、Linux和macOS三大操作系统下的固件烧录实践,重点介绍了RK3576开发板的环境配置、工具链选择、烧录模式切换及常见问题解决方案,帮助开发者构建稳定可靠的跨平台烧录工作流。

cnn8visionary的博客 202

Comsol有限元网格剖分实战:从基础操作到高效仿真技巧

本文系统介绍了COMSOL有限元网格剖分的核心实战技巧。从基础的物理场控制与用户控制网格选择,到三角形、四边形、四面体等网格单元类型的适用场景,再到扫掠网格、边界层网格与复制网格等高效剖分方法,最后讲解了网格质量评估与几何预处理的关键步骤。旨在帮助用户掌握从自动到手动、从基础到高效的网格剖分艺术,实现仿真精度与计算效率的最佳平衡。

j7k8l的博客 375

200122平衡二叉树(AVL树)

平衡二叉树:是一种二叉排序树(BST Tree),其中每一个结点的左子树和右子树的高度差最多等于1。将二叉树上结点的左子树深度减去右子树的深度的值称为平衡因子BF,那么平衡二叉树上的所有结点的平衡因子只能是-1,0,1。 最小不平衡子树:距离新插入结点最近的,且平衡因子的绝对值大于1的结点为根的子树,称之为最小不平衡子树。 下图,当新插入结点37时,树的平衡性被破坏,所以根据定义很容易找出最小不平...

ShenHang_的博客 457

RK3576+IMX415 MIPI摄像头零拷贝显示系统

MIPI CSI-2是嵌入式视觉系统中主流的高速图像传感器接口标准,其核心价值在于低延迟、高带宽与硬件级DMA直通能力。基于V4L2子系统与DRM/KMS驱动栈,可构建从传感器RAW数据到帧缓冲区的零拷贝通路,显著降低CPU负载并提升实时性。该技术广泛应用于工业检测、边缘AI推理前数据接入及多路同步采集等场景。本文以Rockchip RK3576 SoC和索尼IMX415传感器为典型组合,详解MIPI物理层适配、内核驱动集成、GStreamer零拷贝管道搭建及systemd服务化部署,覆盖从硬件信号完整性到

weixin_36047538的博客 216

平衡二叉(查找)树

平衡二叉搜索树,又被称为AVL树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。 —-来自百度百科 由于普通的二叉查找树会容易失去”平衡“,极端情况下,二叉查找树会退化成线性的链表,导致插入和查找的复杂度下降到 O(n) ,所以,这也是平衡二叉树设计的初衷。那么平衡二叉树如何保持”平衡“呢?根据定义,有两个重点,一是左右两子树的高度差...

qq_32172681的博客 447

SkillClaw:让大模型 Agent skill在多用户生态中实现群体进化的框架

随着大模型应用步入深水区,基于 LLM 的智能体(Agent)正从单一的“沙盒玩具”转变为处理真实世界复杂任务的生产力工具。然而,现有的 Agent 系统通常面临一个致命瓶颈——部署即固化。为了解决这一问题,最近有一篇新论文**《SkillClaw: Let Skills Evolve Collectively with Agentic Evolver》**提出了一种多用户生态 Agent 群体进化框架。

kakaZhui的博客 263

YOLO26改进 - 注意力机制 | ParNet并行子网络:多分支协同优化特征表达,增强模型判别能

本文介绍了ParNet注意力机制及其在YOLO26中的应用。ParNet注意力通过并行子网络结构,将网络层组织成多个子网络并行处理输入特征,降低了传统注意力机制在处理长序列时的计算复杂度。该机制采用VGG风格的块和特征融合策略,具有低深度高性能、参数效率高、可扩展性强和并行化能力好等创新点。我们将ParNet注意力引入YOLO26,在检测头部分应用该机制。通过实验训练改进后的模型,有望提升YOLO26在目标检测任务中的性能。

魔改工程师的博客 443

平衡二叉树(AVL)的基本操作(查找、插入、建树)——附带完整代码以及示例

1 定义 概念:在BST(二叉搜索树)的基础上,任意一个结点的左右子树的高度差(平衡因子)的绝对值不超过1。 AVL取自于创建它的两位前苏联的数学家(G.M.Adelse-Velskil和E.M.Landis)的名字。 2 基本操作 2.1 存储结构 struct node{ int data;//结点权值 int height;//当前子树高度 node *lchil...

韩江雪de 小屋 990

Apache Jena SPARQL 查询完全指南:入门与实战案例

本文介绍了使用Apache Jena执行SPARQL查询的完整指南。SPARQL是用于RDF数据的标准查询语言,在知识图谱领域地位相当于SQL。教程从基础开始,涵盖创建模型、加载数据以及执行各种查询类型。特别强调了WHERE子句中的图模式匹配机制,通过Mermaid图直观展示数据图与查询图的匹配过程。文章还对比了变量命名规范(?和$前缀),解释了SPARQL引擎如何通过变量绑定实现数据检索。通过Hello World示例演示了完整查询流程,为开发者提供了SPARQL的实用入门指导。

Lincoln 的专栏 1371

AVL平衡二叉树(二)

这是之前的AVL平衡二叉树的一个实现代码 点击打开链接 下面是看另一本书的实现的 没有了一重重的switch{case...},理解上不太一样,我觉得两种都可以。 //"avltree.h" class AVL_Tree; class AVLNode { friend AVL_Tree; public: AVLNode() {LeftChild = RightChild =

Kay's space 1745

萤石云cs刷机解绑固件

萤石CS-C2C-32WFR刷机包,萤石CS-C6TC刷机包,萤石CS-C6H刷机包,萤石猫眼产品等等。萤石云摄像头固件修改,绑定手机号解绑,更换序列号教程。

海康威视技术支持 2万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

平衡二叉树(AVL)

1.定义 平衡二叉树使树的高度在每次插入元素后仍然能保持O(logn)的级别,这样能让查询操作仍然是O(logn)的时间复杂度。 平衡二叉树由前苏联两位数学家GM.Adele-Velskil和E.M.Landis提出,因此一般也称作AVL树。AVL树仍然是一棵二叉査找树,只是在其基础上增加了“平衡”的要求。所谓平衡是指,对AVL树的任意结点来说,其左子树与右子树的高度之差的绝对值不超过1,其中...

分享包括但不限于计算机基础知识、数据结构与算法、Golang技术栈。年与时驰,意与日去,遂成枯落,多不接世,悲守穷庐,将复何及! 1602

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

算法笔记9.5 平衡二叉树(AVL树)

9.5.1 平衡二叉树的定义 上一节的二叉二叉查找树BST,若按照顺序插入,会退化为一条链,eg:使用序列{1,2,3,4,5}构建二叉树,会得到 于是需要对树的结构进行调整,使得树的高度在每次插入元素后仍然能保持O(logn)的级别,这样就产生了平衡二叉树。 所谓平衡二叉树是指:对AVL树的任意结点来说,其左子树与右子树的高度之差的绝对值不超过1(左右子树的高度之差称为该结点的平衡因...

树叶子的博客 1003

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

二叉树的基本操作_平衡二叉树(AVL树)

title: 平衡二叉树(AVL) date: 2020-01-14 11:26:36 tags: 数据结构1.1平衡二叉树的定义为了解决二叉查找树如果插入的顺序不合适,会导致二叉查找树变成一个单链(可以看二叉查找树文章当中的讨论),例如按照递增序列建立二叉查找树就会导致一边倒的情况,从而无法发挥二叉树可以使得查找保持O(logn)查找的效率。故由使得二叉树的层数越小,导出了平衡二叉树。AVL依然...

weixin_39941262的博客 109

浅析树结构(二)AVL平衡二叉树(AVL树原理及代码实现)

平衡二叉树 平衡二叉树定义 平衡二叉树有两种形式: 是一棵空树 是一个左右两个子树的高度差的绝对值不超过1,并且左右子树都是平衡二叉树的树 平衡二叉树的常用实现方法有AVL树,红黑树,替罪羊树,Treap,伸展树等. 在这里我们先谈AVL树,红黑树会在之后的文章再提出. AVL树 AVL是最先发明的自平衡二叉查找树算法。在AVL中任何节点的两个儿子子树的高度最大差别为1,所以它也被称为...

tubro2017的博客 543

(c语言)AVL平衡二叉树基本小白操作集(附测试用例)

平衡二叉树是二叉搜索树的再次优化,掌握平衡二叉树的一些基本操作,再对后面的树的拓展中,方能做到有的放矢。

执念斩长河 1288

平衡二叉树(AVL树)

平衡二叉树定义 平衡二叉树由前苏年两位数学家G.M.Adelse-Velskil和E.M.Landis提出,因此也称作AVL树。 平衡二叉树是对于任意结点,左右两棵子树高度差的绝对值均小于1的二叉查找树。 结构体定义: struct node{ int v,heigh; node* lchild,*rchild; }; 新建结点操作: //新建结点 node* newNode...

Dunk.Wan 236

平衡二叉树基本操作的演示

二、概要设计 1)平衡二叉树的旋转 avlTree left_left_Rotation(avlTree T) 初始条件:二叉树T存在。 操作结果:实现LL旋转。 avlTree right_right_Rotation(avlTree T) 初始条件:二叉树T存在。 操作结果:实现RR旋转。 avlTree left_right_rotation(avlTree T) 初始条件:二叉树T存在。 ...

donghuaicheng的博客 1088

学习笔记_二叉搜索树与平衡二叉树

平衡树二叉搜索树(BST)定义二叉搜索树的基本操作查找插入删除平衡二叉树(AVL)定义数据结构AVL树的基本操作查找操作过于简单,略插入操作左旋右旋左右旋的意义插入结点分析插入操作代码删除操作过于复杂,先略 二叉搜索树(BST) 定义 二叉搜索树(Binary Search Tree,BST)是一种特殊的二叉树,又称为排序二叉树、二叉排序树。二叉搜索树的递归定义如下: 要么一棵二叉搜索树是一...

weixin_44520881的博客 394

poj 3481 AVL 平衡二叉树

平衡二叉树的简单应用: #include #include typedef struct node { int k, p; struct node *next, *prior; }AVL; AVL *head, *last; AVL *creat() { AVL *s; s = (AVL *)malloc(sizeof(AVL)); s->next

Heu_Ice_Fire的专栏 1233

Java数据结构——AVL树

AVL树(平衡二叉树)定义  AVL树本质上是一颗二叉查找树,但是它又具有以下特点:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,并且拥有自平衡机制。在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为平衡二叉树。下面是平衡二叉树和非平衡二叉树对比的例图:   平衡因子(bf):结点的左子树的深度减去右子树的深度,那么显然-1<...

weixin_30670925的博客 142

数据结构-复习(三):平衡二叉树 AVL

2.9平衡二叉树 原因:由于二叉搜索树的时间复杂度受输入顺序的影响,在最好的情况下复杂度为O(log n),最坏的情况下复杂度为O(n);为了使二叉搜索树的时间复杂度始终保持在O(log n)级的平衡状态,Adelson-Velskii和Landis发明了AVL树(平衡二叉树)。 定义 定义:结点的平衡因子:二叉树中某结点的右子树的高度和左子树的高度之差称为该节点的平衡因子。 平衡二叉树...

dadaima_sama的博客 1198
上一篇: 二叉查找树的基本操作之查找插入删除
下一篇: 平衡二叉树AVL的基本操作之删除
Scandinavians
博客等级 码龄19年 36粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值