小编在学习完AVL树之后觉得AVL树的底层逻辑原理不是很难,在实现AVL树的过程中可能在调整过程中经过旋转调整会有点难,但是小编可以给大家讲解清楚,结合旋转过程的详细解图,相信大家一定可以学会并且理解AVL树的底层逻辑原理及其实现,话不多说,进入学习!~~~
前导:
继上个博客大家学习完搜索二叉树之后,会发现在下面这种情况下,搜索二叉树的效率会大大降低,附图
所以今天我们学习AVL树就是为了解决这种一边倒的情况,让这棵树一直保持在两侧高度差不超过1,以此来提高查找的效率。
一、AVL树的底层逻辑原理
底层原理:插入的过程和搜索二叉树相同,但是保证每次插入一个节点两边的高度差不超过1,这样就是一个AVL树。
二、AVL树的实现原理
实现原理:通过对搜索二叉树的修改来实现AVL树,在实现AVL树的过程中,我们需要引入一个平衡因子来保证每次插入的过程,树两边的高度差仍然是一,再次还要引入一个节点的指针,引入一个父节点的指针(后面旋转有用会讲),引入平衡因子之后就为我们对树进行旋转做了准备,这样就可以通过旋转来保证AVL树的高度差不超过1。
三、AVL树的实现过程
1、在了解AVL树的底层原理之后,大家肯定会对这个新增的平衡因子有疑惑,现在我来告诉大家这个平衡因子的作用,在这里先说一下平衡因子的作用:
平衡因子作用:平衡因子的作用就是为了记录子树两侧的高度差,当高度差大于1的时候就需要进行操作旋转(后面就会讲),来保证树的高度差不超过1,也就是AVL树。
请看下图及其平衡因子的讲解(在这里我们规定右边高度为正,左边高度为负):
因为每次新插入一个节点的时候,树两边的高度差会被改变,所以我们每次插入之后需要更新平衡因子,当平衡因子超过绝对值1之后,也就是高度差超过1之后,就会引出旋转,来保持树的平衡,来做到AVL树。
2、在了解到平衡因子的作用之后,大家先跟着我实现一下AVL树的基础结构,代码如下:
template<class T1, class T2>
struct AVLTreeNode
{
pair<T1,T2> _data;
struct AVLTreeNode<T1,T2>* _left;
struct AVLTreeNode<T1, T2>* _right;
struct AVLTreeNode<T1, T2>* _parent; // 存的是当前节点的父节点
int bf; // balance factor 记录的是当前位置的平衡因子
AVLTreeNode(const pair<T1,T2>& dat