先说说二叉搜索树: 是有序的二叉树,根值>左节点值,右节点值>根值。 如果要查找某个值,二叉搜索树和二分查找一样,每进行一次值比较,就会减少一半的遍历区间。 但是,如果树插入的值一直递增/递减,就会出现这种情况: 这样,二叉树性能就完全失去了,直接退化成了顺序表,查找效率低下。 由此,引入了能保持性能最佳的二叉搜索树。 AVL树: 具有 高度平衡 的二叉搜索树 。 性质: 1.它的左右子树都是AVL树 2. 左右子树高度差(简称平衡因子)的绝对值不超过1 搜索的时间复杂度: O(log2(n)) AVL树节点 struct AVLTree{ pair<K,V> kv; AVLTreeNode* left; AVLTreeNode* right; AVLTreeNode* parent; int bf; //balance factor }; 与二叉搜索树不同的是引入了父节点(方便后面讲的旋转)和平衡因子(保持高度平衡的核心)。 AVL树的插入: 在插入节点后,需要调整平衡: 1.bf更新规则:新增在左 父亲bf-1 ; 新增在右 父亲bf+1 2.持续往祖先更新 如果 祖先bf==0,祖先肯定是从1或者-1变来的