AVL树的旋转操作

来源:互联网 发布:java scanner怎么用 编辑:程序博客网 时间:2024/05/05 21:00

PAT Advanced Level 1066题涉及到了AVL树的元素插入,插入后需要进行旋转操作

在此转载 http://blog.csdn.net/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,需要先对根节点子节点右旋,然后对根节点左旋



1 0
原创粉丝点击