【C++】AVL树

简介: AVL树是一种自平衡二叉搜索树:它以苏联科学家Georgy Adelson-Velsky和Evgenii Landis的名字命名。

AVL的介绍

AVL树是一种自平衡二叉搜索树:它以苏联科学家Georgy Adelson-Velsky和Evgenii Landis的名字命名。

在AVL树中,任何节点的两个子树的高度最多相差1,这保证了树的平衡性,从而使得树的操作(如插入、删除和查找)具有良好的最坏情况性能,时间复杂度为O(log n)

AVL树的旋转操作是其自平衡机制的核心,包括左旋、右旋、左-右旋和右-左旋。这些旋转调整节点的位置,减少子树的高度差,恢复树的平衡。

AVL树特性

严格的平衡性:AVL树的每个节点的左右子树的高度差的绝对值不超过1,这保证了树的高度最小,从而使得操作(如插入、删除和查找)的时间复杂度保持在对数级别。

旋转调整:当插入或删除操作导致节点的平衡因子超出允许范围时,AVL树会通过单旋转或双旋转来重新平衡树。

高效的搜索、插入和删除操作:由于AVL树的高度平衡,这些操作的时间复杂度通常为O(log n),其中n是树中节点的数量。

节点定义:AVL树的节点通常包含数据、指向左右子节点的指针、指向父节点的指针以及记录子树高度差的平衡因子。

高度记录:在AVL树中,每个节点还会记录其子树的高度,这有助于快速计算平衡因子并在需要时进行调整。

适用场景:AVL树适用于需要频繁进行数据插入、删除和查找操作的场景,尤其是在数据集合较大时,可以保持较高的效率。

AVL树的核心

AVL树是一种自平衡的二叉查找树,它通过旋转调整机制来维持树的平衡。当树在插入或删除操作后出现不平衡时,AVL树会执行以下四种旋转操作之一来恢复平衡:

单旋转:

左旋(LL型):当插入或删除操作导致某个节点的左子树的高度比右子树高2时,需要执行左旋操作。左旋操作涉及到将这个节点的右子树提升为新的根节点,并将原根节点作为左子节点挂接到新根节点上。

右旋(RR型):与左旋相反,当某个节点的右子树的高度比左子树高2时,执行右旋操作,即将左子树提升为新的根节点。

双旋转:

左-右旋(LR型):当插入或删除操作导致某个节点的左子树的右子树的高度比左子树的右子树高时,先对左子树执行左旋,然后对原节点执行右旋。

右-左旋(RL型):与左-右旋相反,当某个节点的右子树的左子树的高度比右子树的左子树高时,先对右子树执行右旋,然后对原节点执行左旋。

AVL插入实现

AVL树是基于BST结构,大主体就是BST

问题的解决就是AVL的单旋和双旋以及需要旋转的条件。

AVL的存贮结构

在这里面利用KV结构进行存储数据

左右节点,还有一个父亲节点

为了保持平衡定义_bf(平衡因子:balance factor)

目录
打赏
0
3
2
0
370
分享
相关文章
|
2月前
|
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
【数据结构——树】哈夫曼树(头歌实践教学平台习题)【合集】目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:任务描述 本关任务:编写一个程序构建哈夫曼树和生成哈夫曼编码。 相关知识 为了完成本关任务,你需要掌握: 1.如何构建哈夫曼树, 2.如何生成哈夫曼编码。 测试说明 平台会对你编写的代码进行测试: 测试输入: 1192677541518462450242195190181174157138124123 (用户分别输入所列单词的频度) 预
72 14
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
|
2月前
|
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
61 12
|
2月前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
60 10
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
64 2
|
4月前
|
【C++】AVL树
AVL树是一种自平衡二叉搜索树,由Georgy Adelson-Velsky和Evgenii Landis提出。它通过确保任意节点的两子树高度差不超过1来维持平衡,支持高效插入、删除和查找操作,时间复杂度为O(log n)。AVL树通过四种旋转操作(左旋、右旋、左-右旋、右-左旋)来恢复树的平衡状态,适用于需要频繁进行数据操作的场景。
95 2
|
7月前
|
【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——AVL树
【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——AVL树
65 5
|
8月前
|
C++
【C++】手撕AVL树(下)
【C++】手撕AVL树(下)
78 1
【C++高阶】掌握AVL树:构建与维护平衡二叉搜索树的艺术
【C++高阶】掌握AVL树:构建与维护平衡二叉搜索树的艺术
53 2
|
8月前
|
【C++】手撕AVL树(上)
【C++】手撕AVL树(上)
93 0
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等