左单旋(RR)
/*左旋转操作*/
/*pnode 为最小失衡子树的根节点*/
/*返回旋转后的根节点*/
template<typename T>
AVLTreeNode<T>* AVLTree<T>::leftRotation(AVLTreeNode<T>* proot)
{
AVLTreeNode<T>* prchild = proot->rchild;
proot->rchild = prchild->lchild;
prchild->lchild = proot;
//更新节点的高度值
proot->height = max(height(proot->lchild),height(proot->rchild))+1;
//更新节点的高度值
prchild->height = max(height(prchild->lchild), height(prchild->rchild)) + 1;
return prchild;
};
右单旋(LL)
/*右旋转操作*/
/*pnode 为最小失衡子树的根节点*/
/*返回旋转后的根节点*/
template <typename T>
AVLTreeNode<T>* AVLTree<T>::rightRotation(AVLTreeNode<T>*proot)
{
AVLTreeNode<T>* plchild = proot->lchild;
proot->lchild = plchild->rchild;
plchild->rchild = proot;
//更新节点的高度值
proot->height = max(height(proot->lchild), height(proot->rchild)) + 1;
//更新节点的高度值
plchild->height = max(height(plchild->lchild), height(plchild->rchild)) + 1;
return plchild;
};
右左双旋(RL)
/*先右旋再左旋*/
/*参数 proot 为最小失衡子树的根节点*/
/*返回旋转后的根节点*/
template<typename T>
AVLTreeNode<T>* AVLTree<T>::rightLeftRotation(AVLTreeNode<T>* proot)
{
proot->rchild = rightRotation(proot->rchild);
return leftRotation(proot);
};
左右双旋(LR)
/*先左后右做旋转*/
/*参数 proot 为最小失衡子树的根节点*/
/*返回旋转后的根节点*/
template <typename T>
AVLTreeNode<T>* AVLTree<T>::leftRightRotation(AVLTreeNode<T>* proot)
{
proot->lchild= leftRotation(proot->lchild);
return rightRotation(proot);
};