/**
* 右旋(左子树比右子树高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
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/mdjxy63/article/details/80090824
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。