C++ AVL 树概念讲解与模拟实现
一、AVL 树的概念
理想状态下,当数据乱序且二叉搜索树形态趋近于满二叉树时,查找时间复杂度为 O(logN),效率很高。然而,当数据有序或接近有序时,二叉搜索树会退化成单支树,此时查找的时间复杂度变为 O(N),相当于在顺序表中遍历,效率十分低。
为解决上述问题,两位俄罗斯数学家 G.M.Adelson-Velskii 和 E.M.Landis 在 1962 年提出了 AVL 树(平衡搜索树)。AVL 树是基于二叉搜索树实现的,其核心性质是:向二叉搜索树中插入节点后,若能保证任意节点的左右子树高度差的绝对值不超过 1(通过对树中的节点进行旋转实现),即高度差取值 -1、0 或 1,那么就可以降低树的高度。
这使得树的形态趋近于满二叉树,达到一种平衡,从而减少平均搜索长度。被优化的二叉搜索树进行查找的时间复杂度也就降为 O(logN)。
一颗 AVL 树要么是空树,要么是具有以下性质的二叉搜索树:
- 它的左右子树都是 AVL 树。
- 左右子树的高度差(平衡因子)的绝对值不超过 1。
- 若 AVL 树的节点有 N 个,那么树的高度约为 logN,搜索的时间复杂度为 O(logN)。
二、AVL 树的模拟实现
1. 节点结构设计
AVL 树采用类模板形式,使用 pair 键值对实现。节点结构相对于二叉搜索树新增了平衡因子用于判断是否需要旋转,并且新增了一个父指针,方便在旋转操作中快速找到父节点进行链接。因此,这里的节点结构是三叉链的结构。
#pragma once
#include <iostream>
#include <assert.h>
using namespace std;
template<typename K, typename V>
struct AVLTreeNode {
pair<K, V> _kv;
AVLTreeNode* _left;
AVLTreeNode* _right;
AVLTreeNode* _parent;
int _bf; // 平衡因子
AVLTreeNode(const pair<K, V>& kv)
: _kv(kv), _left(nullptr), _right(nullptr), _parent(nullptr), _bf(0) {}
};
template<typename K, typename V>
class AVLTree {
typedef AVLTreeNode<K, V> Node;
public:
AVLTree() : _root(nullptr) {}
:
Node* _root;
};


