C++AVL树(3)

简介: C++AVL树(3)

5、总结


假如以pParent为根的子树不平衡,即pParent的平衡因子为2或者-2,分以下情况考虑:

pParent的平衡因子为2,说明pParent的右子树高,设pParent的右子树的根为pSubR

当SubR的平衡因子为1时,执行左单旋


当SubR的平衡因子为-1时,执行右左双旋


pParent的平衡因子为-2,说明pParent的左子树高,设pParent的左子树的根为pSubL

当SubL的平衡因子为-1是,执行右单旋


当SubL的平衡因子为1时,执行左右双旋


从视角上来看,当旋转相关结点成直线,则进行单旋;当旋转相关结点成折线,则进行双旋


旋转完成后,原pParent为根的子树个高度降低,已经平衡,不需要再向上更新


五、AVL树的验证


AVL树是在二叉搜索树的基础上加入了平衡性的限制


  • 要验证AVL树可以分两步:


  1. 验证其为二叉搜索树


如果中序遍历可得到一个有序的序列,就说明为二叉搜索树


  • 实现代码:


void _InOrder(Node* root)
{
    if (root == nullptr)
        return;
    _InOrder(root->_left);
    cout << root->_kv.first << " : " << root->_kv.second << endl;
    _InOrder(root->_right);
}


  1. 验证其为平衡树


每个结点子树高度差的绝对值不超过1(注意结点中如果没有平衡因子)以及结点的平衡因子是否计算正确


  • 实现代码:


//验证pRoot是否为有效的AVL树
bool _IsAVLTree(Node* root)
{
    //空树
    if (root == nullptr)
        return true;
  //比较高度
    int heightL = _Height(root->_left);
    int heightR = _Height(root->_right);
    //检查平衡因子是否有误
    if (heightR - heightL != root->_bf)
    {
        cout << "平衡因子错误:" << root->_kv.first << endl;
        return false;
    }
    return abs(heightR - heightL) < 2
        && _IsAVLTree(root->_left)
        && _IsAVLTree(root->_right);//递归检查左右子树
}
//高度
size_t _Height(Node* root)
{
    //空节点
    if (root == nullptr)
        return 0;
    size_t left = _Height(root->_left);
    size_t right = _Height(root->_right);
    return left > right ? left + 1 : right + 1;
}


六、AVL树的性能


分析:

AVL树是一棵绝对平衡的二叉搜索树,其要求每个节点的左右子树高度差的绝对值都不超过1,这样可以保证查询时高效的时间复杂度logN


但是如果要对AVL树做一些结构修改的操作,性能非常低下,比如:插入时要维护其绝对平衡,旋转的次数比较多,更差的是在删除时,有可能一直要让旋转持续到根的位置


总结:

如果需要一种查询高效且有序的数据结构,而且数据的个数为静态的(即不会改变),可以考虑AVL树,但一个结构经常修改,就不太适合


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