首页 > 后端开发 > C++ > 正文

C++怎么实现一个AVL自平衡树_C++数据结构与旋转操作详解

冰火之心
发布: 2025-11-20 18:51:22
原创
711人浏览过
AVL树通过旋转操作维持平衡,确保操作时间复杂度为O(log n)。

c++怎么实现一个avl自平衡树_c++数据结构与旋转操作详解

AVL树是一种自平衡二叉搜索树,它通过保持每个节点的左右子树高度差不超过1来确保查找、插入和删除操作的时间复杂度始终为O(log n)。C++中实现AVL树需要结合二叉搜索树的基本结构,并在插入和删除后通过旋转操作维持平衡。

AVL树的基本结构

每个AVL节点包含数据值、左右子节点指针以及一个表示该节点高度的整数。结构定义如下:

struct TreeNode {
    int data;
    TreeNode* left;
    TreeNode* right;
    int height;
<pre class='brush:php;toolbar:false;'>TreeNode(int val) : data(val), left(nullptr), right(nullptr), height(1) {}
登录后复制

};

高度信息用于计算平衡因子(左子树高度减右子树高度),当平衡因子绝对值大于1时,说明树失衡,需进行旋转调整。

立即学习C++免费学习笔记(深入)”;

旋转操作详解

AVL树通过四种旋转操作恢复平衡:左旋、右旋、左右双旋、右左双旋。这些操作是核心机制。

  • 右旋转(Right Rotation):适用于“左左”情况,即左子树过高且新节点插入在左侧。
  • 左旋转(Left Rotation):适用于“右右”情况,即右子树过高且新节点插入在右侧。
  • 左右双旋:先对左子节点左旋,再对当前节点右旋,处理“左右”插入情形。
  • 右左双旋:先对右子节点右旋,再对当前节点左旋,应对“右左”插入情形。

旋转函数示例如下:

int getHeight(TreeNode* node) {
    return node ? node->height : 0;
}
<p>int getBalance(TreeNode* node) {
return node ? getHeight(node->left) - getHeight(node->right) : 0;
}</p><p>TreeNode<em> rotateRight(TreeNode</em> y) {
TreeNode<em> x = y->left;
TreeNode</em> T2 = x->right;</p><pre class='brush:php;toolbar:false;'>x->right = y;
y->left = T2;

y->height = max(getHeight(y->left), getHeight(y->right)) + 1;
x->height = max(getHeight(x->left), getHeight(x->right)) + 1;

return x;
登录后复制

}

Chromox
Chromox

Chromox是一款领先的AI在线生成平台,专为喜欢AI生成技术的爱好者制作的多种图像、视频生成方式的内容型工具平台。

Chromox 184
查看详情 Chromox

TreeNode rotateLeft(TreeNode x) { TreeNode y = x->right; TreeNode T2 = y->left;

y->left = x;
x->right = T2;

x->height = max(getHeight(x->left), getHeight(x->right)) + 1;
y->height = max(getHeight(y->left), getHeight(y->right)) + 1;

return y;
登录后复制

}

插入操作与平衡维护

插入过程类似二叉搜索树,递归找到位置后创建新节点。回溯过程中更新各节点高度并检查平衡性,必要时执行相应旋转。

TreeNode* insert(TreeNode* root, int data) {
    if (!root)
        return new TreeNode(data);
<pre class='brush:php;toolbar:false;'>if (data < root->data)
    root->left = insert(root->left, data);
else if (data > root->data)
    root->right = insert(root->right, data);
else
    return root; // 不允许重复值

root->height = 1 + max(getHeight(root->left), getHeight(root->right));

int balance = getBalance(root);

// 左左情况
if (balance > 1 && data < root->left->data)
    return rotateRight(root);

// 右右情况
if (balance < -1 && data > root->right->data)
    return rotateLeft(root);

// 左右情况
if (balance > 1 && data > root->left->data) {
    root->left = rotateLeft(root->left);
    return rotateRight(root);
}

// 右左情况
if (balance < -1 && data < root->right->data) {
    root->right = rotateRight(root->right);
    return rotateLeft(root);
}

return root;
登录后复制

}

完整性与使用建议

实际应用中还需实现删除操作,其逻辑更复杂:删除后同样要更新高度并判断是否失衡,然后选择合适旋转修复。遍历方式如中序遍历可用于验证树的有序性。

调试时可添加打印函数输出树结构或节点高度,便于观察旋转效果。注意内存管理,在大型项目中考虑智能指针避免泄漏。

基本上就这些。掌握AVL树的关键在于理解旋转的本质——通过局部结构调整恢复全局平衡,而递归插入提供了天然的回溯时机来进行这些调整。

以上就是C++怎么实现一个AVL自平衡树_C++数据结构与旋转操作详解的详细内容,更多请关注php中文网其它相关文章!

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号