javascript AVL树算法与说明

AVL树算法的动态演示的设计与实现.pdf 《数据结构》 是计算机学科中一门十分重要的核心课程, 而对于算法的理解则是学好该课程的关键。为了使学生更好的理解算法, 作为对课堂教学的有益补充, 我们设计开发了 《AVL树算法的动态演示》 , 以帮助学生理解数据结构算法。本文通过对这种交互式动态演示的设计实现过程的详细描述, 着重讨论了 AVL树动态演示的算法实现。 立即下载

AVL树的介绍

AVL树得名于它的发明者 G.M. Adelson-Velsky 和 E.M. Landis,他们在 1962 年的论文 “An algorithm for the organization of information” 中发表了它。AVL树是一种自平衡二叉搜索树,意思是任何一个节点左右两节点的高度之差最多为1。实际应用中,维护这种高度平衡所付出的代价比从中获得的效率收益还大,故而实际的应用不多。windows对进程地址空间的管理用到了AVL树。


ES6散列表完整实现代码:

let AVLTree = (function() {
    class Node {
        constructor(key) {
            this.key = key;
            this.left = null;
            this.right = null;
        }
    }

    class AVLTree {
        constructor() {
            this.root = null;
            this.parentNode;
            this.nodeToBeDeleted;
        }

        getRoot() {
            return this.root;
        };

        heightNode(node) {
            if(node === null) {
                return -1;
            } else {
                return Math.max(this.heightNode(node.left), this.heightNode(node.right)) + 1;
            }
        };

        rotationLL(node) {
            var tmp = node.left;
            node.left = tmp.right;
            tmp.right = node;

            return tmp;
        };

        rotationRR(node) {
            var tmp = node.right;
            node.right = tmp.left;
            tmp.left = node;

            return tmp;
        };

        rotationLR(node) {
            node.left = this.rotationRR(node.left);
            return this.rotationLL(node);
        };

        rotationRL(node) {
            node.right = this.rotationLL(node.right);
            return this.rotationRR(node);
        };

        insertNode(node, element) {

            if(node === null) {
                node = new Node(element);

            } else if(element < node.key) {

                node.left = this.insertNode(node.left, element);

                if(node.left !== null) {

                    if((this.heightNode(node.left) - this.heightNode(node.right)) > 1) {
                        if(element < node.left.key) {
                            node = this.rotationLL(node);
                        } else {
                            node = this.rotationLR(node);
                        }
                    }
                }
            } else if(element > node.key) {

                node.right = this.insertNode(node.right, element);

                if(node.right !== null) {

                    if((this.heightNode(node.right) - this.heightNode(node.left)) > 1) {

                        if(element > node.right.key) {
                            node = this.rotationRR(node);
                        } else {
                            node = this.rotationRL(node);
                        }
                    }
                }
            }

            return node;
        };

        insert(element) {
            this.root = this.insertNode(this.root, element);
        };


        removeNode(node, element) {
            if(node === null) {
                return null;
            }
            this.parentNode = node;

            if(element < node.key) {
                node.left = removeNode(node.left, element);
            } else {
                nodeToBeDeleted = node;
                node.right = removeNode(node.right, element);
            }

            if(node === this.parentNode) { 
                if(nodeToBeDeleted !== null && element === nodeToBeDeleted.key) {
                    if(nodeToBeDeleted === this.parentNode) {
                        node = node.left;
                    } else {
                        var tmp = nodeToBeDeleted.key;
                        nodeToBeDeleted.key = parentNode.key;
                        parentNode.key = tmp;
                        node = node.right;
                    }
                }
            } else { 

                if(node.left === undefined) node.left = null;
                if(node.right === undefined) node.right = null;

                if((this.heightNode(node.left) - this.heightNode(node.right)) === 2) {
                    if(element < node.left.key) {
                        node = this.rotationLR(node);
                    } else {
                        node = this.rotationLL(node);
                    }
                }

                if((this.heightNode(node.right) - this.heightNode(node.left)) === 2) {
                    if(element > node.right.key) {
                        node = this.rotationRL(node);
                    } else {
                        node = this.rotationRR(node);
                    }
                }
            }

            return node;
        };

        remove(element) {
            parentNode = null;
            nodeToBeDeleted = null;
            root = this.removeNode(root, element);
        };
    }
    return AVLTree;
})()

用法实例

var avlTree = new AVLTree();

avlTree.insert(1);
avlTree.insert(2);
avlTree.insert(3);
avlTree.insert(4);
avlTree.insert(5);
avlTree.insert(6);
avlTree.insert(7);
avlTree.insert(14);
avlTree.insert(15);
avlTree.insert(13);
avlTree.insert(12);
avlTree.insert(11);

avlTree.getRoot();

相关文章

javascript 二叉树(Trees)算法与说明:http://blog.youkuaiyun.com/rth362147773/article/details/77996814
javascript 红黑树算法与说明:http://blog.youkuaiyun.com/rth362147773/article/details/78014688

优化NEXYS A7开发板(Xilinx Artix-7)Microblaze核的FLASH读写性能实战 本文针对NEXYS A7开发板(Xilinx Artix-7)上Microblaze核读写FLASH速度慢的问题,提供了系统性的优化实战指南。通过深入分析SPI控制器配置、Flash指令模式选择、Microblaze核的Cache与硬件加速器优化,以及程序运行位置(BRAM vs DDR)的调整,有效将FLASH读写性能从“龟速”提升至接近理论峰值。文章结合实测数据,为FPGA嵌入式开发者提供了清晰的性能瓶颈分析与解决方案。 阅读详情

相关推荐

【MATLAB】绘制泽尼克多项式

上次只给了公式没有给代码,很多小伙伴表示不是很认可。今天直接把代码发上来了。

HPC_ZY 5574

AVL树(Java实现)

AVL树基本介绍 AVL树是一种自平衡的二叉查找树,在AVL树中任何节点的两个子树的高度差不能超过1。就是相当于在二叉搜索树的基础上,在插入和删除时进行了平衡处理。 不平衡的四种情况 LL:结构介绍 看如下图,假设最初只有k1, k2, k3, y, z五个结点,这时该树两边的高度分别为3和 2,相差为1,满足AVL平衡的概念。 随后插入了结点 x ,导致了不平衡。k1.left....

weixin_30376163的博客 195

经纬度转换为UTM坐标

UTM(通用横向墨卡托投影): 是一种以米为单位的坐标系统,用于地图和GPS导航。将地球划分为60个纵向的区域。每个区域宽6度,从赤道开始往南北两级方向划分。每个区域都有一个特定的字母。

weixin_45626706的博客 7275

数据结构AVL树

等价二分查找树的结构 定义: 中序白能力的相同的任意两个的二叉树的,想出相互等价的,。 引理7:      有N个节点的组成的任何一个二分茶轴的树的T的二分不超过的log2n 的二分查找树等价。 证明:    对T做中序遍历设对应的比哪里的O(T)={t1,t2,,,tn}; 考虑的有N个接待你的组成的完全二叉树的S积极遍历的序列G(s)={s1,s1,,,,sn}; 只要按照的sj...

专注Java(全栈)应用开发,求知若渴,虚心若愚,talk is cheap, show me the code. 1265

如何用capl操控程控电源(RS232)

capl脚本操控RS232

xiaohuanxiong_的博客 3990

基于CubeMX与lwip的STM32轻量级HTTP服务器搭建及VSCode高效开发指南

本文详细介绍了如何在STM32单片机上,利用STM32CubeMX图形化配置工具和轻量级TCP/IP协议栈lwIP,快速搭建一个轻量级HTTP服务器。通过结合VSCode的高效代码编辑能力,提供了一套从硬件连接到动态网页交互(SSI/CGI)的完整开发指南,旨在为嵌入式设备提供零成本、跨平台的Web交互界面。

weixin_29163857的博客 582

AVL树的旋转操作 图解 最详细

AVL树的旋转操作 图解 最详细 各大教课书上讲的都是左旋与右旋,其实这样很容易理解错误,我们换一种叫法。 我们称呼左旋为:逆进针旋转。 我们称呼右旋为:顺进针旋转。

冰冻火山 5万+

C# Log4Net不输出日志的解决方法

log4net是一个流行的 .NET 日志框架,用于记录应用程序的日志信息。如果你在使用log4net。

精通搬砖,资深技术砖家,在软件开发,人工智能,设备开发等领域都有研究。商业合作&交流学习可私信联系。 1263

51nod-1412 AVL树的种类

原题链接 1412 AVL树的种类 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 平衡二叉树(AVL树),是指左右子树高度差至多为1的二叉树,并且该树的左右两个子树也均为AVL树。 现在问题来了,给定AVL树的节点个数n,求有多少种形态的AVL树恰好有n个节点。

L. 1103

(程序设计方法与实践)达拉崩吧的酒宴

达拉崩吧的酒宴 Description 很久很久以前,巨龙突然出现,带来灾难带走了公主又消失不见,王国十分危险,世间谁最勇敢,一位勇者赶来大声喊:“我要带上最好的剑,翻过最高的山,闯进最深的森林,把公主带回到面前”……最后,英雄 达拉崩巴斑得贝迪卜多比鲁翁 ,他战胜了巨龙 昆图库塔卡提考特苏瓦西拉松 ,国王把公主 米娅莫拉苏娜丹妮谢莉红 嫁给了 达拉崩巴斑得贝迪卜多比鲁翁 。 于是国王第二天要在 蒙达鲁克硫斯伯古比奇巴勒城 举办酒宴,一共准备了 N 桶酒。此时一位忠诚的仆人来报,有人在其中一桶酒里下毒,

What_If_I的博客 892

智能车图像处理4-入门级分析3 ---十字路口补线

PS :入门级文章适合新手,如果已经有基础可以去看进阶篇文章。

taiyuezyh的博客 1万+

终极指南:如何实现Algorithms39多语言支持——算法移植完整攻略

Algorithms39是一个包含丰富算法和数据结构的开源项目,本文将为你提供一份完整指南,帮助你实现Algorithms39的多语言支持,轻松将Java算法移植到其他编程语言。无论你是编程新手还是有经验的开发者,都能通过这份教程快速掌握算法移植的核心技巧。 ## 为什么要实现多语言支持? 在全球化的今天,多语言支持能让Algorithms39项目惠及更多开发者。不同的编程语言有其独特的优势和

gitblog_00384的博客 974

关于112G和56G PAM4信号的有效回损(ERL)

本文探讨了回波损耗(RL)对高速数字通信系统性能的影响,重点分析了时域信道运行裕度(COM)与频域回波损耗指标的关联性。研究表明,传统频域回波损耗指标在预测系统性能时存在假阳性/假阴性问题,特别是对PAM-4信号系统影响更为显著。通过引入基于时域脉冲响应的有效回波损耗(ERL)指标,并结合判决反馈均衡器(DFE)的补偿效应,可更准确评估系统性能。实验表明,短封装器件虽然频域回波损耗较差,但在实际系统中表现更优。研究提出通过时域门控加权等方法优化ERL计算,为高速互连设计提供了更可靠的性能评估框架。

小孟同学的博客 290

数据结构?AVL树!!!

本文讨论了有关数据结构中AVL树的相关理解、实现,欢迎大家阅读!!!

2501_90507065的博客 1100

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

javascript实现白平衡树 --- AVL 树

avl树

通俗易懂 457

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

用js来实现那些数据结构14(树02-AVL树)

  在使用二叉搜索树的时候会出现 一个问题,就是树的一条分支会有很多层,而其他的分支却只有几层,就像下面这样:   如果数据量够大,那么我们在某条边上进行增删改查的操作时,就会消耗大量的时间。我们花费...

QDY5945的博客 194

**红黑树、自平衡二叉树、AVL树、B树的比较**

红黑树、自平衡二叉树、AVL树、B树的比较 红黑树和自平衡二叉(查找)树区别 1.红黑树放弃了追求完全平衡,追求大致平衡,在与平衡二叉树的时间复杂度相差不大的情况下,保证每次插入最多只需要三次旋转就能达到平衡,实现起来也更为简单。 2.平衡二叉树追求绝对平衡,条件比较苛刻,实现起来比较麻烦,每次插入新节点之后需要旋转的次数不能预知。 2. AVL树是最早出现的自平衡二叉(查找)树 1.红黑树和...

weixin_44281965的博客 255

数据结构与算法简记:AVL树

前面记录了二叉查找树,它在搜索方面的效率显而易见,可它也存在某种缺陷,假设我们连续插入较小或较大的数据,那么二叉查找树将会逐渐退变为一个线性结构,从而搜索就变为了线性查找,效率将会大打折扣。所以,我们需要一棵这样的树,它在插入新节点后,能够重新调整自己的结构,使左右恢复平衡。AVL树就符合这个条件。 AVL树是最先发明的自平衡二叉查找树,其得名于它的发明者 G.M. Adelson-Vels

陈亮的博客 342

2024年最全【高阶数据结构】AVL树(动图详解)_avl tree,2024年最新面试训练app

根据路线图上的重点去进行有针对性的学习,在学习过程中,学会写笔记,做总结。开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】html5 / css3 学习笔记JavaScript 学习笔记Vue 学习笔记g2nlog_2 nlog2​n)单支树的效率是ONO(N)O(N),AVL树不一样,在10亿中只用找30次(可能多一点)此处我们定义成三叉链结构 ,方便后序的操作;

2401_84617431的博客 1123

javascript 红黑树算法与说明

红黑树的介绍红黑树是一种平衡二叉树。这种树可以进行高效的中序遍历。通过对任何一条从根到叶子的简单路径上各个节点的颜色进行约束,确保没有一条路径会比其他路径长2倍,因而是近似平衡的。所以相对于严格要求平衡的AVL树来说,它的旋转保持平衡次数较少。用于搜索时,插入删除次数多的情况下我们就用红黑树来取代AVL。广泛用在C++的STL中。如map和set都是用红黑树实现的。ES6红黑树完整实现代码:let

rth362147773的博客 1835

js-stl深度解析:高效树结构实现与性能优化技巧

在JavaScript开发中,数据结构的选择直接影响应用性能。js-stl作为经典数据结构库,提供了完整的树结构实现方案。本文将深入解析js-stl中的树结构实现,分享性能优化技巧,帮助开发者掌握高效数据处理的核心技术。 ## 为什么选择js-stl进行树结构开发? js-stl库实现了多种经典树结构,从基础的二叉搜索树到复杂的红黑树、B树等,为JavaScript开发者提供了完整的数据结构解

gitblog_00274的博客 1030

C#算法与数据结构汇总

  数据结构与算法(C#实现)系列-----前言     Heavenkiller (原创)    搞计算机的人都应该很清楚,语言只是一种工具,算法才是灵魂。现在的开发语言有很多,如C++,VB,Perl,java,c#,还有如脚本语言js,vbs等,在如此多的选择面前,很多人不知道该选择哪一种好。其实不管哪一种语言,既然他存在,就一定有他的价值,有它的特定用途,而这往往是其它语言

ronin技术空间 2481

AVL 树的插入、删除、旋转归纳

参考链接: http://blog.youkuaiyun.com/gabriel1026/article/details/6311339 1126号注:先前有一个概念搞混了:   节点的深度 Depth 是指从根节点到当前节点的长度;   节点的高度 Height 是指从当前节点向下,到子孙中所有叶子节点的长度的最大值。 之前简单了解过 AVL 树,知道概念但一直没动手实践...

weixin_30628801的博客 158

开源项目 AVL 使用教程

开源项目 AVL 使用教程 1. 项目的目录结构及介绍 avl/ ├── src/ │ ├── avl.js │ ├── index.js │ ├── node.js │ └── tree.js ├── test/ │ ├── avl.spec.js │ ├── index.spec.js │ ├── node.spec.js │ └── tree.spec.js ...

gitblog_00502的博客 421
上一篇: javascript 二叉树(Trees)算法与说明
下一篇: javascript 红黑树算法与说明
JarunWang
博客等级 码龄18年 57粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值