首页 > 编程语言 >扁扁笨算法-AVL树的插入与删除

扁扁笨算法-AVL树的插入与删除

时间:2023-08-21 13:33:49浏览次数:39  
标签:扁扁 结点 子树 这棵树 AVL 算法 70

扁扁笨算法-AVL树的插入与删除

扁扁笨简述

扁扁笨算法是将不平衡子树打成一条中序遍历的直链(实质是一条升序链),然后按照寻找中点并提起中点构造二叉树的一种朴素做法。扁扁笨算法是一种确定平衡树调整结构之后填入数字的辅助手段,本身并没有什么出彩的地方。

理论简介

AVL树插入之后一般会产生左旋、右旋这样的操作。对于某些情况下,还需要进行先左旋再右旋,或者先右旋再左旋(双旋)的操作。本文提供了一种不需要考虑如何旋转直接调整不平衡AVL树的思路。

大致来说,先画出不平衡的二叉树,沿着插入结点往上寻找最小不平衡子树。

插入举例

第一个例子

如图所示AVL树,插入20结点,调整子树。

img

沿着20结点上溯,可以发现最小不平衡子树就是这棵树本身。

那么从这棵树的根结点出发,沿着上溯路径向下锁定三个结点。

img

然后采用扁扁笨策略,将这棵树打扁成链:{20,30,50,60,70,80},

而之前被选中的结点,将作为新树的最上层三个结点:{20,3050,60,70,80}.

具体来说,让50跑到根结点的位置,让30跑到根结点的左孩子位置,让70跑到根结点的右孩子位置。这个过程称为扁扁笨的上浮操作。

img

在这个例子中,没有浮起来的结点无法再充当下一层的根结点,直接连接即可得到调整之后AVL树。

img

第二个例子

如图所示AVL树,插入20结点,调整子树。

img

沿着67结点上溯,可以发现最小不平衡子树是以70结点为根结点的子树。

那么从这棵树的根结点出发,沿着上溯路径向下锁定三个结点。

img

然后采用扁扁笨策略,将这棵树打扁成链:{67,68,70},

而之前被选中的结点,将作为新树的最上层三个结点:{676870}.

对这三个结点执行扁扁笨的上浮操作,由于这棵树只有这三个结点,上浮后产生的子树就是调整后的子树。

img

将这棵子树接回原AVL树,即可得到最后调整过的AVL树。

img

第三个例子

如图所示AVL树,插入57结点,调整子树。

img

沿着57结点上溯,可以发现最小不平衡子树就是这棵树本身。

那么从这棵树的根结点出发,沿着上溯路径向下锁定三个结点。

img

然后采用扁扁笨策略,将这棵树打扁成链:

{21,26,50,55,57,60,63,66,67,68,70},

而之前被选中的结点,将作为新树的最上层三个结点:

{21,26,50,55,57,60,63,66,67,68,70}.

具体来说,让60跑到根结点的位置,让50跑到根结点的左孩子位置,让66跑到根结点的右孩子位置(扁扁笨的上浮操作)。

img

上浮操作后,我们对剩余的结点进行讨论:

如果区间段上只有两个结点,对于AVL树来说,谁作子树根结点都可以,但原则上与原本的AVL树保持一致。

如果区间段上有三个结点,取中间结点作为子树根结点。

区间段如果是更多的偶数结点或奇数结点,按照相同的逻辑类推即可。

img

整理一下,得到调整后的AVL树:

img

删除举例

如图所示AVL树,删除4结点,调整子树。

img

先找后驱结点进行替换,然后再进行调整。

img

沿结点5向下取,结点1或3任选其一

img

进行上浮操作

img

调整完成,接回原AVL树

img

标签:扁扁,结点,子树,这棵树,AVL,算法,70
From: https://www.cnblogs.com/Ding1fun/p/17645771.html

相关文章

  • 使用MD5算法和sha512sum校验和检验文件完整性
    目录一.前言二.MD5算法简介三.什么是校验和四.使用MD5算法和sha512sum校验和检验文件完整性五.总结一.前言在我们日常生活中,无论是下载文件、传输数据还是备份重要信息,如何确保数据的完整性始终是一个不能忽视的问题。本文将向大家介绍如何使用MD5算法和sha512sum校验和来进行文......
  • 【算法】二分查找实现过程
    1、二分查找的基本思想是,要查找的值和整个数组序列的中间值做比较,确认该值在其中一半里,只要在数组序列一半中继续搜索。2、采用二分查找方法的前提条件是数组或线性表中元素必须按照大小有序排列。代码如下,intmain(){ intarr[]={1,2,3,4,5,6,7,8,9,10}; intk=7......
  • c++算法之哈希表
    啥是哈希表 哈希表,类似散列表,是一种存储数据的一种方式。只能说是有点奇葩。他是通过将值转换成数组的下标,也就是f[x]=x的意思,大家估计都能理解吧......
  • 数据结构与算法八股
    讲一讲插入排序讲一讲冒泡排序讲一讲快速排序讲一讲堆排序讲一讲归并排序 dpdp数组的定义及含义:dp[num1.length+1][num2.length+1],为什么要+1呢,因为我们要判断他与前面的关系涉及到i-1,所以遍历需要从1开始return的是什么如果初始化时候size+1了,那么最后一个下标就是size......
  • 带你来吃瓜!Andy Pavlo教授带您一文回顾数据库的2022年
    theme:fancy编辑/翻译:宇亭校对:王学姣、李浩本文是由数据库界知名专家AndyPavlo教授写的2022年数据库回顾文章,这个系列从去年开始,非常经典,也比较系统的整理了一下数据库界的大事件(当然,主要还是以国外的居多),StoneDB团队对本文进行了翻译,小编在一些链接部分加了注释,方便大家......
  • FlashAttention算法详解
    这篇文章的目的是详细的解释FlashAttention,为什么要解释FlashAttention呢?因为FlashAttention是一种重新排序注意力计算的算法,它无需任何近似即可加速注意力计算并减少内存占用。所以作为目前LLM的模型加速它是一个非常好的解决方案,本文介绍经典的V1版本,最新的V2做了其他优化我们......
  • 【算法】用c#实现自定义字符串编码及围栏解码方法
    编写一个函数/方法,它接受2个参数、一个字符串和轨道数,并返回ENCODED字符串。编写第二个函数/方法,它接受2个参数、一个编码字符串和轨道数,并返回DECODED字符串。然后使用围栏密码对其进行解码。这种密码用于通过将每个字符沿着一组“竖状轨道”依次放在对角线上来对字符串进行编......
  • 分布式共识算法之Raft设计与实现
    如何理解分布式共识?多个参与者针对某一件事达成完全一致:一件事,一个结论已达成一致的结论,不可推翻有哪些分布式共识算法?Paxos:被认为是分布式共识算法的根本,其他都是其变种,但是Paxos论文中只给出了单个提案的过程,并没有给出复制状态机中需要的multi-paxos的相关细节......
  • CGAL入门——凸壳算法
    一、凸壳算法凸壳是能包含点集合的最小凸多边形,即凸壳是点集合的一个子集,将这个子集的点连接起来可以包含点集中所有的点。 二、数组中点的凸壳#include<iostream>#include<CGAL/Exact_predicates_inexact_constructions_kernel.h>#include<CGAL/convex_hull_2.h>......
  • Bcrypt加密算法相关
    简介Bcrypt是一个跨平台的文件加密工具,由它加密的文件可在所有支持的操作系统和处理器上进行转移。它的口令必须是8至56个字符,并将在内部被转化为448位的密钥。spring-security内部就是使用这个算法来对用户密码加密的(BCryptPasswordEncoder)。使用maven依赖<dependency><......