在计算机科学中,C++平衡二叉树(尤其是AVL树)是一种非常重要的自平衡二叉搜索树。它能保证在最坏情况下,插入、删除和查找操作的时间复杂度都为 O(log n)。本教程将手把手教你用 C++ 实现一个完整的 AVL 树,即使你是编程小白,也能轻松理解!
平衡二叉树是一种特殊的二叉搜索树(BST),其左右子树的高度差(称为“平衡因子”)的绝对值不超过 1。最常见的平衡二叉树是 AVL 树,由 Adelson-Velsky 和 Landis 在 1962 年提出。
普通的二叉搜索树在极端情况下(如按顺序插入数据)会退化成链表,导致操作效率从 O(log n) 退化到 O(n)。而 C++数据结构中的 AVL 树通过旋转操作自动维持平衡,确保高效性能。
下面我们逐步实现一个完整的 AVL 树类。
struct Node { int key; Node* left; Node* right; int height; Node(int k) : key(k), left(nullptr), right(nullptr), height(1) {}}; int getHeight(Node* node) { if (node == nullptr) return 0; return node->height;}void updateHeight(Node* node) { if (node == nullptr) return; node->height = 1 + std::max(getHeight(node->left), getHeight(node->right));} // 右旋(用于处理左-左情况)Node* rotateRight(Node* y) { Node* x = y->left; Node* T2 = x->right; x->right = y; y->left = T2; updateHeight(y); updateHeight(x); return x;}// 左旋(用于处理右-右情况)Node* rotateLeft(Node* x) { Node* y = x->right; Node* T2 = y->left; y->left = x; x->right = T2; updateHeight(x); updateHeight(y); return y;} Node* insert(Node* node, int key) { // 1. 执行标准 BST 插入 if (node == nullptr) return new Node(key); if (key < node->key) node->left = insert(node->left, key); else if (key > node->key) node->right = insert(node->right, key); else return node; // 不允许重复键 // 2. 更新当前节点高度 updateHeight(node); // 3. 获取平衡因子 int balance = getHeight(node->left) - getHeight(node->right); // 4. 如果不平衡,进行旋转 // Left Left Case if (balance > 1 && key < node->left->key) return rotateRight(node); // Right Right Case if (balance < -1 && key > node->right->key) return rotateLeft(node); // Left Right Case if (balance > 1 && key > node->left->key) { node->left = rotateLeft(node->left); return rotateRight(node); } // Right Left Case if (balance < -1 && key < node->right->key) { node->right = rotateRight(node->right); return rotateLeft(node); } return node;} #include #include // 上述所有函数定义...int main() { Node* root = nullptr; root = insert(root, 10); root = insert(root, 20); root = insert(root, 30); // 触发左旋 root = insert(root, 40); root = insert(root, 50); root = insert(root, 25); // 触发左右旋 std::cout << "AVL 树构建完成!根节点为: " << root->key << std::endl; return 0;} 通过本教程,你已经掌握了如何用 C++ 实现一个完整的 AVL树实现。AVL 树作为经典的自平衡二叉搜索树,是理解更高级数据结构(如红黑树)的基础。希望你能动手实践,加深对 C++平衡二叉树 和 C++数据结构 的理解!
提示:实际项目中可考虑使用 STL 的 std::set 或 std::map(底层通常为红黑树),但理解 AVL 树原理对算法面试和系统设计至关重要。
本文由主机测评网于2025-12-21发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20251211090.html