平衡二叉树的左右旋

/**
* 右旋(左子树比右子树高2,并且新插入的元素在左子树的左边)
* 此时以左子树(k1)为轴,它的根(k2)进行右旋
* 可以理解为它的根在它的右边,所以右旋(在右边旋转)
*       k2                      k1
*      /  \                    /  \
*     k1   Z      -------     X    k2
*    /  \                    /     / \
*   X    Y                  X'     Y   Z
*  /
* X'
* X'可能在X的左边,也可以在X的右边。例子中假设在左边。
*/

template<class T>
void AVLTree<T>::rotateR(AVLTreeNode<T>* k2)
{
	AVLTreeNode<T>* k1 = k2->left;
	// 开始旋转  
	//先将k1->right(也就是图中的Y,赋值给k2的左子树)
	//然后将k2的所有节点赋值给k1的右子树
	k2->left = k1->right;
	k1->right = k2;

	//更新高度, 先更新k2可以,更新k1时减少一次height函数的调用 
	//k2->height  <====>height(k1->right)
	k2->height = max(height(k2->left), height(k2->right)) + 1;//等价于updateHeight(k2)  
	k1->height = max(height(k1->left), k2->height) + 1;

	k2 = k1;  //更新根节点

}
/**
* 左旋(右子树比左子树高2,并且新插入的元素在右子树的右边)
* 此时以右子树(k1)为轴,它的根(k2)进行左旋
* 可以理解为它的根在它的左边,所以左旋(在左边旋转)
*      K2                           K1
*     /  \                         /  \
*    X    k1         -----        K2   Z
*         / \                    /  \   \
*        Y   Z                  X    Y   Z'
*             \
*              Z'
* Z'可能在Z的左边,也可以在Z的右边。例子中假设在右边。
**/
template<class T>
void AVLTree<T>::rotateL(AVLTreeNode<T>*k2)
{
	AVLTreeNode<T>*k1 = k2->right;
	//开始旋转
	k2->right = k1->left;
	k1->left = k2;

	//更新高度, 先更新k2可以减少一次height函数的调用  
	k2->height = max(height(k2->left), height(k2->right)) + 1;
	k1->height = max(k2->height, height(k1->right)) + 1;

	k2 = k1;
}

    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/mdjxy63/article/details/80090824
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞