AVL树的旋转操作

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值