AVL树或者空树,或者它的左右子树的高度之差的绝对值不超过1;详情的平衡因子请看小编上篇博客。
AVL的平衡旋转可是转晕了不少同学啊,其实理清思路还是很简单的,那么小雷同学就开始show time!
*************************************************************************************************************
什么时候旋转?怎么旋转?
************************************************************************************************************************
左单旋:
template<class E,class K>
void AVLTree<E,K>::RotateL (AVLNode<E,K> *&ptr)
{
AVLNode<E,K> *subL =ptr;
ptr =subL->right;
subL->right = ptr->left;
ptr->left = subL;
ptr->bf = subL->bf = 0;
};
/********************************************************************************************************************/
先左后右旋转
template<class E,class K>
void AVLTree<E,K>::RotateLR (AVLNode<E,K>*&ptr)
{
AVLNode<E,K> *subR =ptr,*subL = subR->left;
ptr = subL->right;
subL->right = ptr->left;
ptr->left = subL;
if(ptr->bf<= 0)subL->bf = 0;
else
subL->bf = -1;
subR ->left = ptr- >right;
if(ptr->bf == -1)subR->bf = 1;
else subR->bf = 0;
ptr->bf = 0;
ptr->right = subR;
};
************************************************************/
插入template<class E,class K>
bool AVLTree<E,K>::Insert(AVLNode<E,K>*&ptr,E&el)
{
AVLNode<E,K> *pr = NULL; *p = ptr,*q; int d;
stack<AVLNode<E,K>*>st;
while(p != NULL)
{
if(el == p->data) return false;
pr = p;st.push(pr);
if(el < p->data) p = p->left;
else p = p->right;
}
p = new AVLNode<E,K>(el);
if(p == NULL){cout<<"error";}
if(pr == NULL){ptr = p;return true;}
else pr->right = p;
while (st.IsEmpty() == false)
{
st.pop(pr);
if(p == pr->left)
pr->bf--;
else
pr->bf++;
if(pr->bf == 0)break;
if(pr->bf == 1|| pr->bf == -1)
p =pr;
else
{
d = (pr->bf<0)>-1:1;
if(p->bf == d)
{
if(d == -1)RotateR(pr);
else RotateL(pr);
}
else
{
if(d == -1)RotateLR(pr);
else RotateRL(pr);
}
break;
}
if(st.IsEmpty() == true) ptr = pr;
else
{
st.getTop(q);
if(q ->data > pr->data)q->left = pr;
else q->right = pr;
}
return true;
}
}