树的左旋与右旋

下图所示操作称为对结点Q的右旋,对结点P的左旋。二者互为逆操作。

简单讲,右旋——自己变为左孩子的右孩子;左旋——自己变为右孩子的左孩子。



  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
            
            
#include<iostream>

class BinTree {
private:
typedef struct node {
int data ;
node * lchild , * rchild , * parent ;
} * tree ;
tree root ;
public:
void right_rotate ( node * p );
void left_rotate ( node * p );
};
void BinTree :: right_rotate ( node * q ){
node * p = q -> lchild ;
node * b = p -> rchild ;
node * fa = q -> parent ;
b -> parent = q ;
q -> lchild = b ;

q -> parent = p ;
p -> rchild = q ;

if ( q == root )
root = p ; //此时p->parent==q 但没关系,已经标记了根为p
else {
p -> parent = fa ;
if ( fa -> lchild == q ) fa -> lchild = p ;
else fa -> rchild = p ;
}
}
void BinTree :: left_rotate ( node * p ){
tree q = p -> rchild ;
tree b = q -> lchild ;
node * fa = p -> parent ;

b -> parent = p ;
p -> rchild = b ;

p -> parent = q ;
q -> lchild = p ;

if ( p == root )
root = q ; //此时q->parent==p 但没关系,已经标记了根为q
else {
q -> parent = fa ;
if ( fa -> lchild == p ) fa -> lchild = q ;
else fa -> rchild = q ;
}

}
来自CODE的代码片
rotate.cpp

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值