社区
Linux_Kernel
帖子详情
数据结构中AVL数的具体构造哪位大侠介绍一下!谢谢
qazokm
2006-03-23 12:57:37
看linux,提到AVL,数据结构中AVL树的具体构造方法哪位大侠介绍一下!谢谢
...全文
136
2
打赏
收藏
数据结构中AVL数的具体构造哪位大侠介绍一下!谢谢
看linux,提到AVL,数据结构中AVL树的具体构造方法哪位大侠介绍一下!谢谢
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
rockefeller8
2006-03-23
打赏
举报
回复
avl树就是平衡二叉树,特点:树中任意节点其左右子树的高度差不超过1。
向一个avl树中插入一个节点,失去平衡有4钟情况,参考《数据结构》严蔚敏、吴伟民,针对4种情况有不同的4种操作改为平衡的。
Jamesonang
2006-03-23
打赏
举报
回复
1. 二叉平衡树(AVL)的定义
一棵AVL树或者是空树,或者左右子树都是AVL树,且左右子树的高度差部超过1.
*有n个节点的树的高度h=O(log(n)).因为具有O(log(n))的高度,就可以在O(log(n))时间里完成平衡树的
查找,删除,插入等操作.
AVL树的检索方法同二叉检索树(BST).
但AVL树经过插入和删除操作后, 可能会变得不平衡.因此必须作些额外的工作以保持平衡.一个重要的概
念就是平衡因子.我们在定义树结点结构的时候加入一个平衡因子域,定义如下:
typdef struct bnode {
datatype data;
int balance; // 平衡因子
struct bnode *lchild, *rchild;
}avl_node, *avl_nodeptr;
*节点p的平衡因子是它左右子树高度之差,所以在平衡条件下,它的值可以为(-1,0,1),当平衡因子为2,-2时,AVL失衡,必须调整已p为根的子树,以保持平衡.
2. AVL的插入
AVl的插入是先插入后调整的策略.
(1)像一般的检索树(BST)那样插入新节点x; //先插入
(2)沿着插入的路径回溯,修改平衡因子;
(3)如果发现失衡(balance= 2 or -2),旋转已p为根的子树,使之平衡.
大致的算法结构是这样的:
// bal 记录以p为根的子树的高度是否升高,如果升高,需要向上回溯.
bal = 0
void AVL_Insert(datatype data, avl_nodeptr p, int &bal)
//这里没有考虑效率,data数据没有使用指针传递
{
if (p == NULL) {
p = (avl_nodeptr)malloc(sizeof(avl_node));
p->data = data;
p->lchild = p->rchild = NULL;
p->balance = 0;
bal = 1;
return ;
}
if (data < p->data) {
AVL_Insert(data,p->lchild,bal); // 插在左子树上
if(bal) Balance_Left(p,bal); // 如果p点升高,进行左平衡
}
else {
AVL_Insert(data,p->rchild,bal); //插在右子树上
if(bal) Balance_Right(p,bal); //如果p点降低,进行右平衡
}
}
需要注意的就是,不同情况的分析(如何旋转以降低树高),以及是否需要回溯(即上层树是否需要旋转,通过修改bal的值来实现,bal = 0 不回溯, 注意if(bal), 同时注意 AVL_Insert调用的bal的引用).
具体的调整算法思想很难用纯文字描述,用实例,画图是比较好的方法.google AVL 应该可以找到很多这方面的资料.
3. AVL树的构造
就是不断调用AVL插入的过程
4. AVL树的删除
类似AVL插入的分析.
数
据结构
脑图
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r8IVKPKz-1680795696832)(https://zhangyuxiangplus.oss-cn-hangzhou.aliyuncs.com/boke//image_1617289780263.png)]关于作者,目前在蚂蚁金服搬砖任职,在支付宝营销投放领域工作了多年,目前在专注于内存
数
据库相关的应用学习,如果你有任何技术交流或大厂内推及面试咨询,都可以从我的个人博客(实际就是图的邻接表结构。特性(与B-树的区别)
数
据结构
-树(二叉树,二分搜索树,堆,线段树,并查集,平衡二叉树,二三树,红黑树)原理与代码实战
树 一:基本
介绍
定义 根节点:一棵树最上面的节点称为根节点。 父节点、子节点:如果一个节点下面连接多个节点,那么该节点称为父节点,它下面的节点称为子 节点。 叶子节点:没有任何子节点的节点称为叶子节点。 兄弟节点:具有相同父节点的节点互称为兄弟节点。 节点度:节点拥有的子树
数
。上图
中
,13的度为2,46的度为1,28的度为0。 树的深度:从根节点开始(其深度为0)自顶向下逐层累加的。上图
中
,13的深度是1,30的深度是2,28的深度是3。 树的高度:从叶子节点开始(其高度为0)自底向上逐层累加的。54
并查集(Union-Find)算法
介绍
及例题讲解
part 1: 先来点带理论的哈! 本文主要
介绍
解决动态连通性一类问题的一种算法,使用到了一种叫做并查集的
数
据结构
,称为Union-Find。 更多的信息可以参考Algorithms 一书的Section 1.5,实际上本文也就是基于它的一篇读后感吧。 原文
中
更多的是给出一些结论,我尝试给出一些思路上的过程,即为什么要使用这个方法,而不是别的什么方法。我觉得
备战 C++ 编程区赛 指南
备战 C++ 编程区赛是一个系统且长期的过程,需要我们在基础知识、算法学习、
数
据结构
拓展、编程规范、模拟竞赛、心态调整以及竞赛策略等多个方面下功夫。每一个环节都相互关联、相辅相成,只有全面扎实地做好各项准备工作,不断积累和提升自己,才能在区赛
中
发挥出自己的最佳水平,取得理想的成绩。希望以上所讲的这些内容能够对各位备战区赛的同学有所帮助,祝愿大家都能在比赛
中
收获成长,收获成功。
Union-find sets
、 概述 并查集(Disjoint set或者Union-find set)是一种树型的
数
据结构
,常用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。 2、 基本操作 并查集是一种非常简单的
数
据结构
,它主要涉及两个基本操作,分别为: A. 合并两个不相交集合 B. 判断两个元素是否属于同一个集合 (1) 合并两个不相交
Linux_Kernel
4,465
社区成员
17,462
社区内容
发帖
与我相关
我的任务
Linux_Kernel
Linux/Unix社区 内核源代码研究区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章