使用C编程语言实现AVL树
本文将介绍AVL树及其插入、删除操作,最后使用C编程语言实现基于平衡因子(balance factor)的AVL树。
什么是AVL树?
AVL树(AVL tree)是前苏联计算机科学家Adelson-Velsky和Landis发明的一种自平衡二叉查找树(self-balancing binary search tree)。它有两大属性,一个是继承自二叉查找树的查找属性(binary search property),另一个是AVL树特有的平衡因子属性(balance factor property)。
节点的平衡因子是节点两个子树的高度差
BalanceFactor(N) = Height(RightSubtree(N)) – Height(LeftSubtree(N))
AVL树限定任意节点两个子树的高度差最大为1
BalanceFactor(N) ∈ {–1,0,+1}
由于AVL树是一种二叉查找树,所以它只能维持大体平衡,无法达到完全平衡。AVL树通过限定任意节点两个子树的高度差最大为1来保证二叉查找树的大体平衡,如果高度差大于1,则需要重新平衡。
AVL树只能大体平衡,2-3-4树通过可变的元素数量可完全平衡。
1
/ \ (1)
5 9 / \
/ (5) (6 9)
6
AVL树 2-3-4树
插入、删除操作
插入、删除操作后需要更新所有被影响的节点的平衡因子,稍作观察就能发现这些节点一定在从根节点到被插入、删除节点的路径上,这些节点都是被插入、删除节点的祖先节点(ancestors)。如何更新这些节点的平衡因子?如果更新后的平衡因子为+2或-2,如何重新平衡(rebalance)?
为了更好的描述,我们把根节点到被插入、删除节点的路径称作查找路径(search path),这条路径贯穿被插入、删除节点的所有祖先节点。
插入6的查找路径为1,9
1
/ \
5 9
删除6的查找路径为1,9
1
/ \
5 9
/
6
所以插入、删除操作只会影响查找路径上节点的平衡因子,而不会影响别的节点的平衡因子。
AVL树的插入操作
插入操作可能会导致查找路径上节点的高度增大,所以需要更新查找路径上节点的平衡因子,如果更新平衡因子后节点违背了平衡因子属性,则需要通过旋转进行重新平衡。过程如下:
- 从被插入节点的父节点开始,按照查找路径原路返回直到根节点,返回过程中更新当前节点的平衡因子,如果发现当前节点更新后的平衡因子绝对值大于1,则使用旋转操作进行重新平衡;
- 达到以下任一条件则完成所有操作。
a. 节点高度保持不变;
b. 旋转操作(该节点必然恢复原高度);
c. 到达根节点。
AVL树的删除操作
与插入操作类似,删除操作可能会导致查找路径上节点的高度减小,所以需要更新查找路径上节点的平衡因子,如果更新平衡因子后节点违背了平衡因子属性,则需要通过旋转进行重新平衡。过程如下:
- 从被删除节点的父节点开始,按照查找路径原路返回,返回过程中更新当前节点的平衡因子,如果发现当前节点更新后的平衡因子绝对值大于1,则使用旋转操作进行重新平衡;
- 达到以下任一条件则完成更新和修复操作。
a. 节点高度保持不变;
b. 旋转操作且旋转后节点恢复原高度;
c. 到达根节点。
综上,AVL树的插入操作最多只需要一次旋转操作就能重新平衡,而删除操作则可能需要多次旋转操作才能重新平衡。
AVL树的实现
经过较长时间的学习和分析,使用C编程语言实现了一个完整的基于平衡因子的AVL树,源码链接为https://github.com/xieqing/avl-tree,该实现通过了较完整的测试用例的验证,README.md对AVL树的实现做了详尽的分析,另外,通过一个简单的使用示例avl_example.c,您可以快速了解它的使用方法。
欢迎大家指正。
/*
* Copyright (c) 2019 xieqing. https://github.com/xieqing
* May be freely redistributed, but copyright notice must be retained.
*/
使用C编程语言实现AVL树的更多相关文章
- 算法与数据结构(十一) 平衡二叉树(AVL树)
今天的博客是在上一篇博客的基础上进行的延伸.上一篇博客我们主要聊了二叉排序树,详情请戳<二叉排序树的查找.插入与删除>.本篇博客我们就在二叉排序树的基础上来聊聊平衡二叉树,也叫AVL树,A ...
- AVL树原理及实现(C语言实现以及Java语言实现)
欢迎探讨,如有错误敬请指正 如需转载,请注明出处http://www.cnblogs.com/nullzx/ 1. AVL定义 AVL树是一种改进版的搜索二叉树.对于一般的搜索二叉树而言,如果数据恰好 ...
- AVL树
AVL树 在二叉查找树(BST)中,频繁的插入操作可能会让树的性能发生退化,因此,需要加入一些平衡操作,使树的高度达到理想的O(logn),这就是AVL树出现的背景.注意,AVL树的起名来源于两个发明 ...
- AVL树的平衡算法(JAVA实现)
1.概念: AVL树本质上还是一个二叉搜索树,不过比二叉搜索树多了一个平衡条件:每个节点的左右子树的高度差不大于1. 二叉树的应用是为了弥补链表的查询效率问题,但是极端情况下,二叉搜索树会无限接近 ...
- 【数据结构】平衡二叉树—AVL树
(百度百科)在计算机科学中,AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下都是O(log n).增 ...
- 数据结构图文解析之:AVL树详解及C++模板实现
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...
- 数据结构之平衡二叉树(AVL树)
平衡二叉树(AVL树)定义如下:平衡二叉树或者是一棵空树,或者是具有以下性质的二叉排序树: (1)它的左子树和右子树的高度之差绝对值不超过1: (2)它的左子树和右子树都是平衡二叉树. AVL树避免了 ...
- PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由
03-树1. List Leaves (25) Given a tree, you are supposed to list all the leaves in the order of top do ...
- 论AVL树与红黑树
首先讲解一下AVL树: 例如,我们要输入这样一串数字,10,9,8,7,15,20这样一串数字来建立AVL树 1,首先输入10,得到一个根结点10 2,然后输入9, 得到10这个根结点一个左孩子结点9 ...
随机推荐
- 使用java注解实现toJson方法
如果我有一个对象user,它有几个属性,我想把该对象序列化成一个json字符串,怎么做?我怎么把这种类型的问题实现成一个函数? 注解类似于在被注解的对象上,添加一些简单的属性.在运行时解析这些属性,以 ...
- CSS Core Technology
1. Selector Different types of selectors: Selectors can be divided into the following categories: Si ...
- Elisp 中变量赋值函数 set 与 setq 辨析
在 Elisp 中,为变量赋值的函数有 set 与 setq,但是,两者存在很大的差异. 使用 set 赋值: 如果我们想为变量 flowers 赋值为一个 列表 '(rose violet dais ...
- Python之while循环
1.While循环基础 2.While循环进阶 3.其他
- DockerToolbox在Win7上的安装和设置
为什么使用Docker Toolbox Docker在Windows上使用有两种方式,一是利用VirtualBox建立linux虚拟机,在linux虚拟机中安装docker服务端和客户端,二是利用Wi ...
- CentOS 与Ubuntu 下配置IP地址
1.CentOS配置方法如下: 用vi打开配置文件 [root@haha3 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 写入以下配置 DEVIC ...
- nginx1.14.0日志打印
nginx日志打印 http属性log_format来设置日志格式 ,参考 https://www.jb51.net/article/52573.htm <nginx日志配置指令详解> ...
- 根据导出的查询结果拼接字符串,生成sql语句并保存到txt文件中
import os os.chdir("C:/") path = os.getcwd() print(path) f = open("sql.csv") # p ...
- phpstorm 如何设置识别vue文件
非常简单,步骤如下: 第一步: 设置->plugins->browser repositories 搜索vue.js,然后安装一下vue.js插件,重启ide. 第二步: Editor - ...
- oracle、grid 用户ID
oracle.grid 用户ID [root@db-rac02 rules.d]# id oracle uid=54321(oracle) gid=54321(oinstall) groups=543 ...