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
- AVL树旋转的操作
- AVL树的旋转操作
- AVL树的旋转操作
- AVL树的旋转操作
- 【AVL树】AVL树的插入操作以及旋转
- AVL树的旋转,插入,删除操作
- 数据结构-----AVL树的旋转操作
- AVL树的旋转操作详解
- AVL树的旋转与插入操作
- AVL树的旋转
- AVL树的旋转
- AVL树的旋转
- AVL树的旋转
- AVL树的旋转
- AVL树的旋转
- AVL树的旋转
- AVL树的旋转
- AVL树的旋转
- 黑盒测试知识整理
- 思考2:在路上.请带上脑子
- webRTC知识分享——API
- js获取上传文件大小并比较。
- HDOJ 5442 Favorite Donut
- AVL树的旋转操作
- C++ stringstream介绍,使用方法与例子
- 你设计的测试用例颗粒度多大合适?(一)
- Hibernate – One-to-One example (Annotation)
- CCSprite(2)(cocos2dx-2.2.5)
- 判断一个类是否实现了某个接口
- hdu3072 Intelligence System(tarjan缩点+最小树形图)
- 2015物联网智能家居高峰论坛即将举行
- html5开发中td高度固定,超出部分隐藏无法实现的解决方案