平衡二叉树AVL(JS实现)

数据结构----平衡二叉树的JS实现 在高效的检索方法中, 二分检索法具有最高的查找效率,但是它只适合于顺序存储结构,这样对于数据的操作和删除操作带来不便。 二叉排序树不仅有二分检索的效率,同时保持数据的动态性。但是当二叉排序树只有左子树或者右子树,二叉排序树就退化成了单链表,具有较低的检索效率。 平衡二叉树就可以解决这种问题。平衡二叉树又称为AVL树,它或是一颗空树,或是具有以下性质的二叉树: 它的左右子树都是平衡二叉树,且左子树和右子树的高度之差绝对值不超过1。 平衡二叉树的调整 插入时通过对二叉树的调整可以保持这棵树为平衡二叉树。只有这么 阅读详情

1 定义

平衡二叉树是一种二叉排序树,其中每个节点的左子树和右子树的高度差至多等于1。其中,二叉树节点的左子树深度减去右子树深度的值称为平衡因子(BF),因此平衡二叉树节点的平衡因子值只能为1、0或-1。距离插入节点最近的,且平衡因子的绝对值大于1的节点为根的子树,我们称为最小不平衡子树。
在这里插入图片描述

2 平衡二叉树的构建过程

平衡二叉树的构建过程基于二叉排序树的构建过程,在插入节点的过程中,一旦出现不平衡现象(即某节点的平衡因子大于1或小于-1),就找出最小不平衡子树,进行“旋转”操作,调整最小不平衡子树中各节点的链接关系,使之成为新的平衡子树。“旋转过程”就好比一条扁担出现一头重一头轻的现象,若能将扁担的支撑点改变,扁担两头就平衡了。
前人总结出在二叉排序树中插入节点而失去平衡的情况下,对最小不平衡子树进行调整,有4种“旋转”类型(LL型,RR型,LR型,RL型),分别对应不同的不平衡情况。其中LL型和RR型只需要一次旋转,而LR型和RL型则需要两次旋转。每种类型又可进一步细分为3种情况,总共4×3=12种情况

LL型(最小不平衡子树的根结点平衡因子值大于1且与根结点左孩子节点的平衡因子符号相同)
在这里插入图片描述
RR型(最小不平衡子树的根结点平衡因子值小于-1且与根结点右孩子节点的平衡因子符号相同)
在这里插入图片描述
LR型(最小不平衡子树的根结点平衡因子值大于1且与根结点左孩子节点的平衡因子符号不相同)
在这里插入图片描述
RL型(最小不平衡子树的根结点平衡因子值小于-1且与根结点右孩子节点的平衡因子符号不相同)
在这里插入图片描述
注意最小不平衡子树中节点的平衡因子值在旋转调整前后的变化,其中LL型和RR型平衡因子变化一致,而LR型和RL型则需分开讨论

3 代码

首先建立二叉树节点进行定义

function Node(key){
	this.data = key;    //存储数据
	this.bf = 0;         //平衡因子
	this.lChild = null;   //左孩子节点
	this.rChild = null;   //右孩子节点
}

接着是对不平衡子树中某一节点T的一次左旋和右旋操作函数代码,返回旋转后的新节点

//左旋
function L_Rotate(T){
	let R = T.rChild;
	T.rChild = R.lChild;
	R.lChild = T;
	return R;
}

//右旋
function R_Rotate(T){
	let L = T.lChild;
	T.lChild = L.rChild;
	L.rChild = T;
	return L;
}

现在我们假设对根结点为T的不平衡子树做左旋和右旋操作函数分别为LeftBalance(T)和RightBalance(T),该函数返回新的根结点。那么平衡二叉树的插入操作代码如下

var taller = true;
var temp = null;
function insertAVL(T,key){   //插入节点至平衡二叉树
	if (!T){              //节点不存在,则在此位置新建节点
		T = new Node(key);
		taller = true;
	}else{
		if (key === T.data){   //如果二叉树中已有与key相同的值,而不插入
			taller = false;
			return 0;
		}else if (key < T.data){   //如果插入值小于当前节点值
			temp = insertAVL(T.lChild,key); //则在当前节点的左子树继续搜索
			if ( temp === 0) return 0;  //未插入
			T.lChild = temp;
			if (taller){
				switch (T.bf){      //在当前节点的左子树成功插入节点时
					case 1:       //原本左子树比右子树高,插入节点后,需要做平衡处理
						T = leftBalance(T);  
						taller = false;
						break;
					case 0:       //原本左子树和右子树一样高,插入节点后,树长高
						T.bf = 1;
						taller = true;
						break;
					case -1:     //原本左子树比右子树矮,插入节点后,现左右树等高
						T.bf = 0;
						taller = false;
						break;
				}
			}
		}else{                   //如果插入值大于当前节点值
			temp = insertAVL(T.rChild,key); //则在当前节点的右子树继续搜索
			if ( temp === 0) return 0;  //未插入
			T.rChild = temp;
			if (taller){
				switch (T.bf){    //在当前节点的右子树成功插入节点时
					case 1:       //原本左子树比右子树高,插入节点后,现左右树等高
						T.bf = 0;
						taller = false;
						break;
					case 0:        //原本左子树和右子树一样高,插入节点后,树长高
						T.bf = -1;
						taller = true;
						break; 
					case -1:       //原本左子树比右子树矮,插入节点后,需要做平衡处理
						T = rightBalance(T);
						taller = false;
						break;
				}
			}
		}
	}
	return T;
}

最后一步,实现对根结点为T的不平衡子树的旋转操作,需要分情况讨论只用一次旋转还是要有两次旋转。

function leftBalance(T){   //对根结点为T的不平衡子树进行旋转调整操作
	let lc = T.lChild;   //根结点的左孩子
	switch (lc.bf){
		case 1:      //新节点插入在根结点左孩子的左子树。为LL型
			lc.bf = 0;
			T.bf = 0;
			return R_Rotate(T);   //LL型为一次旋转
		case -1:   //新节点插入在根结点左孩子的右子树。为LR型
			let rd = lc.rChild;  //指向根结点左孩子的右子树根
			switch (rd.bf){   //对应LR型的三种平衡因子变化情况
				case 1:       
					lc.bf = 0;
					T.bf = -1;
					break;
				case -1:      
					lc.bf = 1;
					T.bf = 0;
					break;
				case 0:
					lc.bf = 0;
					T.bf = 0;
					break;
			}
			rd.bf = 0;
			T.lChild = L_Rotate(T.lChild);  //LR型为两次旋转
			return R_Rotate(T);
	}
}


function rightBalance(T){    //对根结点为T的不平衡子树进行旋转调整操作
	let rc = T.rChild;   //根结点的右孩子
	switch (rc.bf){
		case -1:      //新节点插入在根结点左孩子的左子树。为RR型
			rc.bf = 0;
			T.bf = 0;
			return L_Rotate(T);   //RR型为一次旋转
		case 1:   //新节点插入在根结点左孩子的右子树。为RL型
			let ld = rc.lChild;  //指向根结点左孩子的右子树根
			switch (ld.bf){   //对应RL型的三种平衡因子变化情况
				case 1:      
					rc.bf = -1;
					T.bf = 0;
					break;
				case -1:      
					rc.bf = 0;
					T.bf = 1;
					break;
				case 0:
					rc.bf = 0;
					T.bf = 0;
					break;
			}
			ld.bf = 0;
			T.rChild = R_Rotate(T.rChild); //RL型为两次旋转
			return L_Rotate(T);
	}
}

平衡二叉树的删除操作更为复杂,先占个坑,以后有空再来慢慢研究,https://blog.youkuaiyun.com/goodluckwhh/article/details/11786079/

实战指南 | 利用TSMaster的C小程序实时监控DBC报文发送周期 本文提供了一份利用TSMaster的C小程序实时监控DBC报文发送周期的实战指南。通过创建用户变量、编写C小程序核心逻辑并关联图形模块,工程师可以直观地可视化关键报文(如ID 0x64)的发送间隔,从而快速发现周期异常,提升汽车电子开发和测试中总线问题定位的效率与实时性。 阅读详情

相关推荐

电动汽车充电设备标准化设计方案:电气原理图

80kW一体式一机一枪充电机电气原理 主电路拓扑见图1,配置1个250A直流充电连接装置,提供4个充电模块安装位置,根据充电功率需求可选配2~4个20kW充电模块。内置直流电能表和计费控制单元,实现计量计费和充电控制功能。 图1 80kW一体式一机一枪充电机主电路拓扑 ...

santirenpc的博客 1万+

数据结构之——平衡二叉树代码实现

一、结构定义 public class BalanceTree { //根节点 private Node root; /** * 静态内部类,定义节点。 */ private static class Node { //数据域 private int data; //父节点 ...

m0_37914588的博客 4944

QMT实盘避坑指南:从环境配置到策略部署的完整流程(含国金证券路径设置)

本文是一份详尽的QMT实盘交易避坑指南,重点解析了从环境配置到策略部署的完整流程。针对国金证券QMT平台,文章深入剖析了核心架构、精准路径配置、关键参数解析、交易操作实战及异常处理,并提供了策略部署、监控与日志构建的完整方案,旨在帮助具备Python基础的开发者规避常见陷阱,实现稳定可靠的实盘交易。

weixin_29309475的博客 592

平衡二叉树(AVL树)

平衡二叉树(AVL树) 1、问题引入 给你一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST), 并分析问题所在. 左子树全部为空,从形式上看,更像一个单链表. 插入速度没有影响 查询速度明显降低(因为需要依次比较), 不能发挥 BST的优势,因为每次还需要比较左子树,其查询速度比单链表还慢 解决方案-平衡二叉树(AVL) 2、基本介绍 平衡二叉树也叫平衡 二叉搜索树(Self-balancingbinary search tree)又被称为 AVL 树,可以保证查询效率较高。 具有以

qq_43906881的博客 332

基于单片机控制双向可控硅灯光强度设计

*单片机设计介绍,基于单片机控制双向可控硅灯光强度设计。

QQ2193276455的博客 2457

使用运放构建电压跟随器

运放,是运算放大器的简称 运算放大器是用模拟电子器件(如晶体管,场效应管,二极管等)构成的模拟集成电路,其特点是有很高的放大倍数和抗干扰能力,因此可以被设计成各种用途的派生电路,如电压比较器、窗口电路、波形发生电路等等,其中也有电压跟随器。 电压跟随器是一种具有100%电压负反馈的放大器电路,其特点是输出电压的幅度和极性都与输入电压相同,所以叫跟随器。典型线路如图所示: 运放跟随器有输入阻抗高,而输出阻抗低的特性,一般来说,输入阻抗可以达到几兆欧姆,而输出阻抗低,通常只有几欧姆,甚至更低。 在电

Code for Coffee 5万+

【数据结构】平衡二叉树(AVL) C语言实现

平衡二叉树,也称为 AVL 树,是一种二叉排序树,用于解决二叉排序树高度不确定的情况。可以是空树;左子树和右子树的高度之差的绝对值小于等于1;左子树和右子树也是平衡二叉树。插入结点后,最小不平衡子树的BF与它的子树的BF符号相反时,就需要对结点先进行一次旋转以使得符号相同后,再反向旋转一次才能够完成平衡操作。

crr411422的博客 2513

【YOLOv8/v9/v10 实战 01】YOLOv8/v9/v10全系列实战对决:性能矩阵、架构拆解与2026部署指南

2026年YOLO生态已进入“战国时代”,Ultralytics YOLOv8/11/26、阿里YOLO12、清华YOLOv10、微软YOLOv9四大路线并行发展。本文基于官方文档、学术论文及实测数据,系统剖析三大核心版本(YOLOv8/v9/v10)的架构演进逻辑,构建覆盖参数量、mAP、FPS、FLOPs的完整性能矩阵。通过8组工业场景实测、全流程代码实现(训练-导出-部署)、6类硬件适配方案,解决新手选型难、进阶者优化无门、工业开发者部署低效的痛点。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 534

数据结构(6)树形结构——平衡二叉树(JAVA代码实现)

平衡二叉树的概念,平很二叉树的LL、RR、RL、LR旋转,以及JAVA版本的AVL树的实现。

BugMan的博客 1812

一文吃透 Tools for Applying SAP Notes:从 SNOTE、TCI 到 Solution Manager 与 SAP Cloud ALM

本文系统梳理了SAP技术与运维团队应用SAP Notes的高效工具与方法,涵盖On-Premise与云环境。文章首先阐述了精研SAP Notes工具的必要性,指出其是实施错误修复、法务变更和性能改进的关键载体。随后详细介绍了SNOTE、TCI、Solution Manager、Cloud ALM和Maintenance Planner等核心工具的定位与适用场景,并通过采购异常案例展示了标准更正流程。针对复杂修复场景,文章提出了TCI的批量处理方案,并强调将Note实施纳入变更治理流程的重要性。最后总结了三种

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 354

让 PyCharm 代码“发光”:高亮插件与特效全攻略

PyCharm 作为一款强大的 Python IDE,支持多种插件让代码“发光”——无论是动态输入特效、彩虹括号,还是霓虹主题,都能让你的代码脱颖而出!进入 File → Settings → Editor → Color Scheme → Rainbow Brackets。进入 File → Settings → Appearance & Behavior → Material Theme。进入 File → Settings → Editor → Color Scheme → General。

qq_43580271的博客 3835

js创建平衡二叉树(AVL)和搜索二叉树(BST)

class tree { constructor (val) { this.val = val this.left = this.right = null } } 搜索二叉树: class BST { constructor (data) { let len = data.length, i...

qq_16049879的博客 353

使用MATLAB的COMSOL LiveLink:实时连接和数据传输

COMSOL LiveLink是一种功能强大的MATLAB工具包,它允许用户在MATLAB环境中与COMSOL Multiphysics软件进行实时连接和数据传输。COMSOL LiveLink是一种功能强大的MATLAB工具包,它允许用户在MATLAB环境中与COMSOL Multiphysics软件进行实时连接和数据传输。使用COMSOL LiveLink,你可以进行更复杂的模型设置和数据传输使用MATLAB的COMSOL LiveLink:实时连接和数据传输。

PixelNinja的博客 2090

JS实现平衡二叉树

JS实现平衡二叉树废话不多说我直接上撸代码,喜欢的直接拷走即可使用,有问题请留言,转载请注明出处。代码class AVLTree { constructor(num) { // this.root = {}; this.value = num; this.height = 1; this.leftChild = null;

wang516038746的博客 1034

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

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

牛客网-剑指offer[编程题]平衡二叉树 js详解

平衡二叉树(Balanced Binary Tree) 具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。 最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,可以参考Fibonacci数列,1是根节点,F(n-1)是左...

kotoriyou的博客 243

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

用快马AI三分钟构建平衡二叉树可视化工具:从理论到交互实践

通过这个项目,不仅巩固了对平衡二叉树的理解,也体验到了可视化工具的强大教学价值。支持更多平衡树变体如B树的演示添加自动生成随机测试用例的功能记录操作历史并支持回放如果你也想快速验证某个算法或数据结构的可视化方案,推荐试试InsCode(快马)平台,从想法到可交互demo真的只需要喝杯咖啡的时间。

SilvermistFalcon19的博客 602

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

学习JavaScript数据结构和算法(部分三)

看了 Loiane Groner 著的《学习JavaScript数据结构与算法》一书,自己写篇博客对着敲敲代码: 全文包含十个部分,分别是:数组、栈、队列、链表、集合、字典与散列表、树、图、排序和搜索算法、算法补充知识。 知识点第一部分请参考: 知识点第二部分请参考: 接下来学习第三部分: 7、树 到目前为止,介绍了一些顺序数据结构(例如:数组、队列、链表等),介绍的第一个非顺序...

qq_20901397的博客 2981

Javascript数据结构之禅:平衡二叉树(Balanced Binary Tree, AVL Tree)

Javascript数据结构之禅:平衡二叉树(Balanced Binary Tree, AVL Tree)项目源码地址: github.com/KristenXu/JavascriptDatastructures/blob/master/AVLTree.js1 .基本概念AVL树的复杂程度真是比二叉搜索树高了整整一个数量级——它的原理并不难弄懂,但要把它用代码实现出来还真的有点费脑筋。下面我们来

Chainn的全栈之旅 2978

js实现平衡二叉树

平衡二叉树定义(AVL):它或者是一颗空树,或者具有以下性质的二叉排序树:它的左子树和右子树的深度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树 平衡二叉树必须是二叉搜索树 var Node=function(key) { this.key=key; this.lchild=null; this.rchild=null; this.height=1;//平衡因子 } var root = null;//根节点 getRoot=function(){return r.

simple5960的博客 515

JS数据结构之平衡二叉树(AVL树)

AV树的旋转AVL树概念不平衡概况四种平衡旋转方式RL平衡旋转(先右后左双旋转)LR平衡旋转(先左后右单旋转) AVL树概念 前面学习二叉查找树和二叉树的各种遍历,但是其查找效率不稳定(斜树),而二叉平衡树的用途更多。查找相比稳定很多。(欢迎关注数据结构专栏) AVL树是带有平衡条件的二叉查找树。这个平衡条件必须要容易保持。而且要保证它的深度是O(logN). AVL的条件是左右树的高度差(平衡因子)不大于1;并且它的每个子树也都是平衡二叉树。 对于平衡二叉树的最小个数,n0=0;n1=1;nk=n

qq_44222205的博客 495

【从蛋壳到满天飞】JS 数据结构解析和算法实现-AVL树(一)

前言 【从蛋壳到满天飞】JS 数据结构解析和算法实现,全部文章大概的内容如下: Arrays(数组)、Stacks(栈)、Queues(队列)、LinkedList(链表)、Recursion(递归思想)、BinarySearchTree(二分搜索树)、Set(集合)、Map(映射)、Heap(堆)、PriorityQueue(优先队列)、SegmentTree(线段树)、Trie(字典树)、U...

weixin_34029680的博客 220

前端面试题目整理——实现平衡二叉树AVL

AVL是BST的升级版,搜索性能更高。 function Node(key) { this.data = key this.left = null this.right = null } function AVL(arr) { this.root = null this.createAVL(arr) } AVL.prototype.createAVL = f...

Astar的博客 703

dom4j实现为list添加父节点_javascript实现平衡二叉树

基本介绍1.平衡二叉树也叫平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树, 可以保证查询效率较高。2.具有以下特点:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。解决办法,对树进行单旋转左旋转:右旋转:双旋转(有时进行单旋转...

weixin_30833209的博客 98

平衡二叉树删除_自平衡二叉树的JS实现

平衡二叉树的实现我们在遍历二叉树时,先一直往左遍历,于是我们发现,当一棵树的每个节点都只有一个子节点时,他就变成了一个链表,然后链表就说啊:❝ 年轻人你不要过度消费我,这好吗?这不好。 ❞所以我们针对这个问题进行优化,就出现了「平衡二叉树」。何为平衡,平衡是指,二叉树中任意节点的左右子树的高度差都不大于1。当插入或删除一个节点时,我们需要通过一次或多次树的「旋转」来保持二叉树的平衡。树的旋转分为「...

weixin_39610415的博客 86

平衡二叉树及其操作实现_自平衡二叉树的JS实现

平衡二叉树的实现我们在遍历二叉树时,先一直往左遍历,于是我们发现,当一棵树的每个节点都只有一个子节点时,他就变成了一个链表,然后链表就说啊:❝ 年轻人你不要过度消费我,这好吗?这不好。 ❞所以我们针对这个问题进行优化,就出现了「平衡二叉树」。何为平衡,平衡是指,二叉树中任意节点的左右子树的高度差都不大于1。当插入或删除一个节点时,我们需要通过一次或多次树的「旋转」来保持二叉树的平衡。树的旋转分为「...

weixin_28568819的博客 259
上一篇: 散列表
下一篇: B树和B+树
PAT-python-zjw
博客等级 码龄10年 381粉丝 408原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值