预备知识
二叉树;二叉查找树;AVL树的基本定义,AVL树的左旋,右旋。
(关于原理性的问题请移步《算法笔记》P319,这里仅仅是解释一下关于 插入的理解)
- 结点的结构
struct node{
int v,height;
node *lchild, *rchild;
};
- 定义新的结点(可以理解为是根节点)
node * newNode(int x){
node * Node=new node;
Node->v=x;
Node->height=1;//作为初始结点,高度为1;
Node->lchild=Node->rchild=NULL;
return Node;
}
- 获取当前结点所在的height
int getHight(node * root){
if(root==NULL)return 0;
else return root->height;
}
- 计算当前结点平衡因子(左子树高度-右子树高度)
int getheightFractor(node * root){
return getHight(root->lchild)-getHeight(root->rchild)
- 更新结点的height
void updatedHeight(node * root){
root->height=max(getHeight(root->lchild),getHeight(root->rchild)+1;
- 左旋
void L(node *&root){//这里有引用,即为了能够修改这个结点r
node * temp=root->rchild;//建立一个新的结点t,用来代替root->rchild
root ->rchild=temp->lchild;//进行子树上的替换
temp->lchild=root;
updatedHeight(root);
upratedHeight(temp);//进行各自高度的更新(因为各自的子树的高度是没有更替的)
root=temp;//(此时temp已经坐上了root的位置,给换回来,temp在其中起的作用就是作为一个中间变量,便于其他各个量的替换)
}
- 右旋(同理不赘述)
void r(node *&root){
node *temp=root->lchild;
r->lchild=temp->rchild;
temp->rchild=root;
updatedHeight(root);
updatedHeight(temp)
root=temp;
}
插入
观察发现,只有将最靠近插入点的失衡结点调整到正常,其他的所有结点都会正常。
那么可以先假设有一个失衡点A(则失衡因子为2,-2)
则会出现LL LR RL RR四种情况。
LL->把C看成一个整体,在A处进行一个右旋操作;
LR->先左旋成LL结构,再重复LL;
RR->左旋;
RL->先右旋成RR,再重复RR;
我是个憨憨,写了一遍博客,才明白意思