AVL树的旋转问题及写法


AVL *right_leftRotate(AVL *x){
    AVL *y=x->right;
    AVL *z=y->left;
    y->left=z->right;
    x->right=z->left;
    z->left=x;
    z->right=y;
    x->height=getHeight(x);
    y->height=getHeight(y);
    z->height=getHeight(z);
    return z; 
}

AVL树的右左旋能不能不先右旋再左旋,而是这样写?

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7665215
  • 这篇博客也不错, 你可以看下【数据结构】AVL树的平衡化旋转及实现AVL树的插入操作
  • 除此之外, 这篇博客: AVL树的插入与旋转算法解析中的 1、AVL树的基本概念: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • AVL树又称为平衡二叉排序(搜索)树,AVL树得名于它的发明者 G.M. Adelson-Velsky 和 E.M. Landis,他们在 1962 年的论文 “An algorithm for the organization of information” 中发表了它。分解开来看:AVL树是一棵二叉树进一步是一棵二叉排序树、并且AVL树涉及平衡因子这个概念。节点的平衡因子是它的右子树与左子树的高度(深度)之差 。如果一个节点的平衡因子为-1、0或1(即平衡因子绝对值不大于1) 则该节点被认为是平衡的;而对于一棵树,任意一个节点都是平衡的那么这棵树也是平衡的。在我们向AVL树中插入一个节点时,可能会打破该树的平衡性,所以就需要重启对其进行平衡操作。

    举个简单的例子:

    这里写图片描述

    在未进行插入操作以前,对于节点45来说,其左子树高度为2,右子树为1,平衡因子绝对值等于1(之后的均用左右子树之差的绝对值表示平衡因子,不需再强调),所以此时是平衡的。但是对于第一种插入情况:插入的值小于根节点,因此插入了高度本就大的左子树中,平衡因子绝对值被增大到2因此不再是平衡二叉排序树。

  • 您还可以看一下 李胜金老师的红黑树与AVL树 数据结构高级篇课程中的 红黑树的使用场景介绍小节, 巩固相关知识点