AVL树的插入

news2024/11/29 20:48:02

 

 

介绍: 在二叉搜索树的前提下,左右高度差(平衡因子)的绝对值不大于1

二叉搜索数->中序排序树->极端情况下时间复杂度高 ->我博客更过不了解去翻翻

(搜索二叉树——寻找节点,插入节点,删除节点_别想闲鱼了!快去学习的博客-CSDN博客)

平衡因子=右树高度-左树高度

写一下AVL的插入操作

首先就是 插入新的数 -> 流程就是二叉搜索数插入方式

 // 像搜索二叉树的操作插入
        TreeNode node = new TreeNode(val);
        if(root==null){
            root = node;
            return true;
        }

        TreeNode parent =  null;
        TreeNode cur = root;
        while (cur!=null){
            if(cur.val > val){
                parent = cur;
                cur = cur.left;
            } else if(cur.val == val){
                return false;
            } else {
                parent = cur;
                cur = cur.left;
            }
        }
        if(parent.val>val){
            parent.left = node;
        } else {
            parent.right = node;
        }
        node.parent = parent;
        cur = node;

调节一下平衡因子

 // 调节平衡因子
        while (parent != null){
            // 检查左右
            if(cur == parent.right){
                parent.bf++;
            }else {
                parent.bf--;
            }
            // 检查平衡因子
            if(parent.bf==0){
                // 平衡
                break;
            } else if(parent.bf==1 || parent.bf==-1){
                // 继续向上修改
                cur = parent;
                parent = cur.parent;
            } else {
                // 不是高度差绝对值小于1了 进行调整
                if(parent.bf==2){
                    if(cur.bf==1){
                        // 左旋
                        rotateLeft(parent);
                    } else{
                        // cur.bf==-1
                        rotateRL(parent);
                    }
                } else {
                    if(cur.bf==-1){
                        // 右旋
                        rotateRight(parent);
                    } else{
                        // cur.bf==1
                        rotateLR(parent);
                    }
                }
                break;
            }
        }

okk重点操作 左旋情况 

parent.bf==2
cur.bf==1

 

 

private void rotateLeft(TreeNode parent) {
        TreeNode subR = parent.right;
        TreeNode subRL = subR.left;
        subR.left = parent;
        parent.right = subRL;
        if(subRL != null){
            subRL.parent = parent;
        }
        TreeNode pParent = parent.parent;
        parent.parent = subR;
        if(parent==root){      
            root = subR;
            root.parent = null;
        } else {
            if(pParent.left==parent){
                pParent.left = subR;
            } else {
                pParent.right = subR;
            }
            subR.parent = pParent;
        }


        subR.bf = 0;
        parent.bf = 0;

    }

当然右旋也同理可得~~~

我们再来看 左右旋

parent.bf==-2
cur.bf==1

 

 

 所以可以看出 平衡因子修改还要有限制条件~~~(subLR)

private void rotateLR(TreeNode parent) {
        TreeNode subL = parent.left;
        TreeNode subLR = subL.right;
        int bf = subLR.bf;

        rotateLeft(subL);
        rotateRight(parent);

        if(bf==1){
            subL.bf = -1;
            parent.bf = 0;
        }else if(bf==-1){
            subL.bf = 0;
            parent.bf = 1;
        }

        subLR.bf = 0;

    }

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

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

相关文章

硬核推荐!3款私藏的卡通头像在线生成网站,减少撞“头”率

现在各个软件应用都会有自己的头像设置,肯定有很多朋友经常喜欢换头像,我猜大家的头像要么就是明星,要么就是网图,总是出现和别人撞“头”的现象。今天就来给大家推荐几个在线制作头像的网站,保证让撞“头”率减少90%。…

【MYSQL】聚合函数和单表/多表查询练习、子查询、内外连接

目录 1.聚合函数 1.1.group by子句 1.2.having语句 2.单表查询 2.2单表查询 3.多表查询 3.2.子查询 5.内链接 6.外连接 1.聚合函数 函数说明count返回查询到的数据的数量sum返回查询到的数据的总和avg返回查询到的数据的平均值max返回查询到的数据的最大值min返回查询…

WPF MVVM基础教程(五)RelativeSource属性绑定

RelativeSource属性绑定 介绍RelativeSource属性介绍RelativeSource的Mode属性有四种模式: 四种模式用法Self模式FindAncestor模式使用规则: TemplatedParent模式PreviousData模式 特殊用法绑定到其他ViewModel上的命令 介绍 RelativeSource 是一个标记…

前端HTML学习(二)

1、列表标签 列表标签概述:能够使用无序列表、有序列表、自定义列表标签,实现网页中列表结构的搭建。列表应用在网页中按照行展示关联性的内容,如:新闻列表、排行榜、账单等。 特点:按照行的方式,整齐显示内容 种类&a…

大模型遭泄两月后 Meta意外变赢家

一份被意外泄露的谷歌内部文件,将Meta的LLaMA大模型“非故意开源”事件再次推到聚光灯前。 “泄密文件”的作者据悉是谷歌内部的一位研究员,他大胆指出,开源力量正在填平OpenAI与谷歌等大模型巨头们数年来筑起的护城河,而最大的受…

Ae:摄像机命令

Ae 中提供了一些摄像机命令,可帮助更好地运用摄像机,比如实现跟焦、切换对焦对象(图层)、展现指定图层内容等等。 Ae菜单:图层/摄像机 Camera 这些命令也可在摄像机图层的右键菜单中选择。 基于 3D 视图生成摄像机 Cre…

MySQL基础-数据库介绍

本文介绍MySQL基础,包括什么是数据库,什么是关系型数据库,数据库和实例区别,数据库分类 文章目录 前言什么是数据库?什么是数据库管理系统(DBMS)?什么是关系型数据库管理系统&#x…

Springboot +Flowable,设置流程变量的方式(一)

一.简介 为什么需要流程变量。 举个例子,假设有如下一个流程,截图如下: 这是一个请假流程,那么谁请假、请几天、起始时间、请假理由等等,这些都需要说明,不然领导审批的依据是啥?那么如何传递…

HTML + CSS (包含移动Web) 笔记

前言 主要还是比较的一些html css&#xff1b;当然也有一些css样式时平时开发中经常用到的&#xff0c;但是我不晓得的&#xff0c;所以还是记录一下吧&#xff1b;给孩子点点关注吧&#xff01;&#x1f62d; 壹、HTML 一、标签 1.1 标题标签 块级元素 <h1> 好好…

go-micro框架-01-启动微服务及微服务间的调用

文章目录 1. 环境准备1.1 安装protoc1.2 安装 go-micro 2. 创建微服务项目2.1 创建第一个服务2.2 初始化2.3 同法再创建2个服务2.4 初始化项目 3. 微服务间调用4. 使用 consul4.1 启动consul4.2 修改代码 1. 环境准备 1.1 安装protoc https://github.com/protocolbuffers/pro…

webpack: 5 报错,错误

webpack-报错&#xff1a;Uncaught ReferenceError: $ is not defined (webpack) webpack打包jquery的插件&#xff08;EasyLazyLoad&#xff09;时&#xff0c;报错 方法一&#xff1a; //多个js文件用到jquery&#xff0c;用这种方法 在jquery.min.js的做最后写上下面的代码…

中交路桥科技浅谈:边坡稳定的影响因素及边坡主要监测内容

边坡稳定的影响因素 岩&#xff08;土&#xff09;性质的影响&#xff1a;包括岩石的坚硬程度、抗风化能力、抗软化能力、强度、组成、透水性等&#xff1b; 岩土结构的影响&#xff1a;表现为节理裂缝的发育程度及其分布规律、结构面的胶结情况、软弱面和破碎带的分布与边坡…

记录--ThreeJs手搓一个罗盘特效

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 先上效果 前言 最近在学Three.js.,对着文档看了一周多&#xff0c;正好赶上码上掘金的活动&#xff0c;就顺便写了一个小demo&#xff0c;手搓一个罗盘特效。 太极 先来看一下太极的实现方式&#xff…

教你一招轻松搞定大量视频滚动字幕

如果你也想批量快速的给大量视频画面添加上滚动字幕的话&#xff0c;那你一定要看这个教程&#xff0c;今天小编要给大家分享一个可以批量给大量视频添加滚动字幕的简单方法&#xff0c;有需要的小伙伴们可以一起来看看具体的操作步骤&#xff01; 首先我们来看看用这个工具添加…

c语言-指针

指针详解 ​ 这段时间在看 Linux内核&#xff0c;深觉C语言功底不扎实&#xff0c;很多代码都看不太懂&#xff0c;深入学习巩固C语言的知识很有必要。先从指针开始。 什么是指针 ​ C语言里&#xff0c;变量存放在内存中&#xff0c;而内存其实就是一组有序字节组成的数组&…

跨域时怎么处理 cookie?

前言 一个请求从发出到返回&#xff0c;需要浏览器和服务端的协调配合。浏览器要把自己的请求参数带给服务端&#xff0c;服务端校验参数之后&#xff0c;除了返回数据&#xff0c;也可能会顺便把请求是否缓存&#xff0c;cookie等信息告诉浏览器。当请求是跨域请求的时候&…

uniapp仿淘宝购物车demo

项目是基于uview2.0的ui组件&#xff0c;并且在一定程度上修改过原本组件的代码&#xff08;app-navbar是使用u-navbar在进行二次封装的组件&#xff1b;u-number-box也进行了修改&#xff09;&#xff0c;符合项目需求&#xff08;这个看个人项目需求在进行修改&#xff09; u…

【 在线音乐平台(onlinemusic) 】

文章目录 一、核心功能二、效果演示三、创建项目四、数据库设计及配置数据库4.1 数据库和表设计4.2 配置连接数据库 五、创建配置类六、具体功能实现6.1 注册模块6.2 登录模块拓展&#xff1a;登录注册加密(MD5&#xff0c;BCrypt) 6.3 退出模块6.4 上传音乐模块知识拓展1&…

RabbitMQ详解(六):RabbitMQ集群搭建

集群 官方参考文档&#xff1a;https://www.rabbitmq.com/clustering.html RabbitMQ这款消息队列中间件产品本身是基于Erlang编写&#xff0c;Erlang语言天生具备分布式特性&#xff08;通过同步Erlang集群各节点的magic cookie来实现&#xff09;。因此&#xff0c;RabbitMQ天…

什么是柔性玻璃?

柔性玻璃(Flexible glass)是一种新型薄膜玻璃基板(Thin film glass substrate)材料&#xff0c;厚度极薄可以弯曲。 柔性玻璃定义有广义和狭义之分&#xff1a; 广义柔性玻璃泛指所有制成微米尺寸具有可弯曲特性的玻璃材料&#xff0c;如玻璃纤维、光纤、玻璃棉、玻璃布等。这些…