PAT Advanced Level 1066题涉及到了AVL树的元素插入,插入后需要进行旋转操作
在此转载 http://blog.youkuaiyun.com/collonn/article/details/20128205 和 http://dongxicheng.org/structure/avl/ 两篇文章整理AVL树的几种旋转操作
AVL树的基本数据结构:
typedef struct Node* Tree;
typedef struct Node* Node_t;
typedef Type int;
struct Node{
Node_t left;
Node_t right;
int height;
Type data;
};
int Height(Node_t node) {
return node->height;
}
针对插入元素可能导致的不平衡,可以通过旋转使之变平衡。有两种基本的旋转:
(1)左旋转:将根节点旋转到(根节点的)右孩子的左孩子位置
Node_t LeftRotate(Node_t a) {
b = a->right;
a->right = b->left;
b->left = a;
a->height = Max(Height(a->left), Height(a->right));
b->height = Max(Height(b->left), Height(b->right));
return b;
}
(2)右旋转:将根节点旋转到(根节点的)左孩子的右孩子位置
Node_t RightRotate(Node_t a) {
b = a->left;
a->left = b->right;
b->right = a;
a->height = Max(Height(a->left), Height(a->right));
b->height = Max(Height(b->left), Height(b->right));
return b;
}
有四种种情况可能导致二叉查找树不平衡,分别为:
(1)LL:插入一个新节点到根节点的左子树(Left)的左子树(Left),导致根节点的平衡因子由1变为2,需要对根节点做右旋
(2)RR:插入一个新节点到根节点的右子树(Right)的右子树(Right),导致根节点的平衡因子由-1变为-2,需要对根节点做左旋
(3)LR:插入一个新节点到根节点的左子树(Left)的右子树(Right),导致根节点的平衡因子由1变为2,需要先对根节点子节点左旋,然后对根节点右旋
(4)RL:插入一个新节点到根节点的右子树(Right)的左子树(Left),导致根节点的平衡因子由-1变为-2,需要先对根节点子节点右旋,然后对根节点左旋