二叉平衡树

一直想深入的研究一下,并手写平衡二叉树的插入、删除代码。

二叉树是动态查找的典范,但在极限情况下,二叉树的查找效果等同于链表,而平衡二叉树可以完美的达到 log ⁡ 2 n \log_2 n log2n

AVL简称平衡二叉树,缩写为BBST,由苏联数学家 Adelse-Velskil 和 Landis 在 1962 年提出。

例子:

将17,9,2,12,14,26,33,15,40,23,25一次插入到一棵初始化为空的AVL树中,画出该二叉平衡树。

解:过程和结果如下图所示。

在这里插入图片描述

所谓平衡二叉树,就是指二叉树的左、右子树的深度差不超过2。每当超过时,需要对二叉树的失衡节点进行平衡。

BBST用两个整数来表示左右子树的深度,前面一个表示左子树的层数,右边一个代表右子树的层数。

调整时,首先需要找到要平衡的节点。找到调整节点后,处理的方法有4种:

上图中圆标号1的是左-左结构,标号2的是左-右结构,标号3的是右-右,标号4的是右-左结构,这4种结构的处理方式各有不同。

  1. 左-左结构,即(2,1)结构

中间节点当作父节点,最上面的节点当作右节点,最下边节点当作左节点

  1. 左-右结构,即(2,-1)结构

最下面节点当作父节点,父节点当作右节点,中间节点当作左节点

  1. 右-右结构,即(-2,-1)结构

中间节点当作父节点,最上面的节点当作左节点,最下边节点当作右节点

  1. 右-左结构,即(-2,1)结构

最下面节点当作父节点,最上面节点当作左节点,中间节点当作右节点

编程中,计算左、右子树深度的代码如下:


int deep(BBST* b) {if (b == 0){return 0;}int ld =  deep(b->lchild);int rd = deep(b->rchild) ;return ld > rd ? ld + 1 : rd + 1;
}

有了上面的理论和编程基础,我们可以慢慢的调试并手动写出平衡二叉树的插入代码:


int BBSTree::insert(ELEMENT* e) {if (mTree == 0){mTree = newnode(e);mSize = 1;return 1;}BBST* t = mTree;BBST* tc = 0;Stack s;ELEMENT elem;while (1) {if (e->e == t->data.e) {return 0;}else if (e->e > t->data.e){if (t->rchild == 0){tc = newnode(e);tc->parent = t;t->rchild = tc;mSize++;break;}else {			elem.e = (unsigned long long)t;s.push((ELEMENT*)&elem);t = t->rchild;				}}else {if (t->lchild == 0){tc = newnode(e);tc->parent = t;t->lchild = tc;mSize++;break;}else {elem.e = (unsigned long long)t;s.push((ELEMENT*)&elem);t = t->lchild;		}}}while (s.isEmpty() == 0) {s.pop(&elem);BBST* b = (BBST*)elem.e;b->ld = deep(b->lchild);b->rd = deep(b->rchild);t->ld = deep(t->lchild);t->rd = deep(t->rchild);int high_diff = b->ld - b->rd;int low_diff = t->ld - t->rd;if(high_diff == 2 && low_diff == 1){BBST* f = (BBST*)b->parent;if (f&&f->lchild == b){f->lchild = t;}else if (f&&f->rchild == b){f->rchild = t;}BBST* old_tr = t->rchild;t->rchild = b;b->parent = t;t->parent = f;b->rchild = old_tr;}else if (high_diff == 2 && low_diff == -1){BBST* f = (BBST*)b->parent;if (f->lchild == b){f->lchild = tc;}else if (f->rchild == b){f->rchild = tc;}BBST* ltmp = t;while (ltmp->rchild){ltmp = ltmp->rchild;}tc->lchild->parent = ltmp->rchild;ltmp->rchild = tc->lchild;BBST* rtmp = b;while (rtmp->lchild){rtmp = rtmp->lchild;}tc->rchild->parent = rtmp->lchild;rtmp->lchild = tc->rchild;tc->rchild = b;tc->lchild = t;b->parent = tc;t->parent = tc;tc->parent = f;}else if (high_diff == -2 && low_diff == 1){BBST* f = (BBST*)b->parent;if (f&&f->lchild == b){f->lchild = tc;}else if (f&&f->rchild == b){f->rchild = tc;}BBST* rtmp = b;while (rtmp && rtmp->rchild){rtmp = rtmp->rchild;}tc->lchild->parent = rtmp->rchild;rtmp->rchild = tc->lchild;BBST* ltmp = t;while (ltmp && ltmp->lchild){ltmp = ltmp->lchild;}tc->rchild->parent = ltmp->lchild;ltmp->lchild = tc->rchild;tc->rchild = t;tc->lchild = b;b->parent = tc;t->parent = tc;tc->parent = f;}else if (high_diff == -2 && low_diff == -1){BBST* f = (BBST*)b->parent;if (f && f->lchild == b){f->lchild = t;}else if (f && f->rchild == b){f->rchild = t;}BBST* old_tl = t->lchild;t->lchild = b;b->parent = t;t->parent = f;b->lchild = old_tl;}tc = t;t = b;}return 0;
}

完整代码地址:
https://github.com/satadriver/dataStruct

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

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

相关文章

Linux系统调试课:I2C tools调试工具

文章目录 一、如何使用I2C tools测试I2C外设1、I2C tools概述: 2、下载I2C tools源码:3、编译I2C tools源码: 4、i2cdetect 5、i2cget 6、i2cdump

Vue+ElementUI技巧分享:结合Sortablejs实现表格行拖拽

文章目录 前言准备工作示例代码代码说明1. 引入依赖和组件结构2. 组件数据和生命周期3. 实现拖拽功能4. 更新数据和服务器同步 运行效果总结 前言 在很多动态网页应用中,用户界面的交互性是提高用户体验的关键。在 Vue.js 中,结合 Element UI 和 sortab…

初识树型结构与二叉树

1. 树型结构 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树(它是根朝上,而叶朝下的),其物理结构如下图所示&#x…

Ubuntu 20.04 安装 mysql8 LTS

Ubuntu 20.04 安装 mysql8 LTS sudo apt-get update sudo apt-get install mysql-server mysql --version mysql Ver 8.0.35-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu)) Ubuntu20.04 是自带了 MySQL8. 几版本的,低于 20.04 则默认安装是 MySQL5.7.33 s…

rpm安装gitlab

1.rpm包下载 https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/ 2.进行安装 rpm -ivh gitlab-ce-15.9.7-ce.0.el7.x86_64.rpm --nodeps --force 3.配置访问地址 vim /etc/gitlab/gitlab.rb 4.重新加载配置以及重启服务 gitlab-ctl reconfiguregitlab-ctl resta…

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux文件管理(2)》(26)

《Linux操作系统原理分析之Linux文件管理(2)》(26) 8 Linux文件管理8.4 虚拟文件系统 VFS8.4.1 VFS 的工作原理8.4.2 VFS 超级块8.4.3VFS 的 inode 8.5 文件系统的安装与注册8.5.2 文件系统的注册 8 Linux文件管理 8.4 虚拟文件系…

HarmonyOS4.0从零开始的开发教程05 应用程序入口—UIAbility的使用

HarmonyOS(三)应用程序入口—UIAbility的使用 UIAbility概述 UIAbility是一种包含用户界面的应用组件,主要用于和用户进行交互。UIAbility也是系统调度的单元,为应用提供窗口在其中绘制界面。 每一个UIAbility实例,…

python数据分析基础

前言 2023年10月以来,一位在商学院就读的可爱同学遇上了一门课——python数据分析,并遇到了许多问题,找上了我,就此,我也开始了学习之路,虽然很浅显,但这些东西对部门同学来说也是受用的&#…

Weblogic CVE-2023-21839(metasploit版)

Step1:用docker搭建环境 Step2:docker查看映射端口 Step3:访问特定端口,然后靶标应用。 Step4:用metasploit进行攻击: 首先,打开metasploit,然后查询需要攻击的板块&#xff0…

指定分隔符对字符串进行分割 numpy.char.split()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 指定分隔符对字符串进行分割 numpy.char.split() 选择题 请问下列程序运行的的结果是: import numpy as np print("【执行】np.char.split(I.Love.China, sep .)") p…

Linux进程解析(冯诺依曼体系结构,操作系统,进程初步解析)

冯诺依曼体系结构: 我们常见的计算机,如笔记本。我们常见的计算机,服务器,大部分都遵守冯诺依曼体系。 截至目前,我们所认识的计算机,都是有一个个的硬件组件组成: 中央处理器(CPU)&am…

Linux socket编程(12):Unix套接字之socketpair、sendmsg和recvmsg详解

在上一篇文章Unix套接字编程及通信例子中,我们对Unix套接字编程有一个基本的了解。但在Unix套接字编程的领域中,有一组特殊而强大的工具:socketpair、sendmsg 和 recvmsg,它们为实现本地进程间通信提供了便捷的方式。 文章目录 1 …

绝地求生:NH究极天命圈惊险吃鸡,17斩获单日积分第一,4AM梦游暂居倒数

绝地求生PGC小组赛B组第一轮的比赛即将结束,在刚刚那场决赛圈中NH和17给我们上演了非常精彩的较量,双方战至最后一人,最终由NH击败17收获一鸡,这两支PCL老牌强队总分都超过了40分,晋级胜者组对他们来说压力不大了。新队…

【FPGA图像处理实战】- FPGA图像处理仿真测试工程(读写BMP图片)

FPGA开发过程中“行为功能仿真”是非常必要的一个过程,如果仿真都没通过,则上板测试必定失败。 FPGA图像处理需要读写大量的图像数据,单看这些图像数据实际是没有规则的,如果直接上板测试,调试起来非常困难&#xff0…

看图学源码之— HashMap源码分析

简介: 是基于 哈希表 实现的,存放 k-v 键值对,非同步的方式(未加 synchronized )非线程安全的,hashmap 无序的数据结构: 数组 链表 > 数组 链表 红黑树「链表 和 链表 红黑树 都是为了解…

QT+Unity3D 超详细(将unity3D与QT进行连接,并实现信息传递)

QTUnity3D连接 在QT中连接unity3D,首先要有一个unity.exe执行文件。在这里不提供unity执行文件的编写,只提供QT这边与unity3D连接和信息传递。 创建项目 创建一个新的项目,我创建的项目名称如下。 下图是我建立新项目的文件。APP文件就是…

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux文件管理(1)》(25)

《Linux操作系统原理分析之Linux文件管理(1)》(25) 8 Linux文件管理8.1 Linux 文件系统概述8.2 EXT2 文件系统8.2.1 EXT2 文件系统的构造8.2.2 EXT2 超级块(super block)8.2.3 组描述符8.2.4 块位图 8.3 EX…

智能优化算法应用:基于社交网络算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于社交网络算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于社交网络算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.社交网络算法4.实验参数设定5.算法结果6.参考…

用23种设计模式打造一个cocos creator的游戏框架----(七)代理模式

1、模式标准 模式名称:代理模式 模式分类:结构型 模式意图:为其他对象提供一种代理以控制对这个对象的访问。 结构图: ​ 适用于: 远程代理:也称为大使,这是最常见的类型,在分…

2022年第十一届数学建模国际赛小美赛C题人类活动分类解题全过程文档及程序

2022年第十一届数学建模国际赛小美赛 C题 人类活动分类 原题再现: 人类行为理解的一个重要方面是对日常活动的识别和监控。可穿戴式活动识别系统可以改善许多关键领域的生活质量,如动态监测、家庭康复和跌倒检测。基于惯性传感器的活动识别系统用于通过…