AVL树的单旋与双旋

AVL树的单旋与双旋

问题

AVL(Adenlson-Velskii 和 Landis)树是带有平衡条件的二叉查找树。其平衡条件是每个节点的左子树和右子树的高度最多差1。

因为按照二叉查找树的性质(树中的每个节点X,它的左子树中所有的关键字值要小于X的关键字值,右子树相反),在AVL树中插入新的节点后,很容易产生不平衡的状况,因此需要借助单旋或者双旋操作来使AVL树重新满足平衡条件。

情况分析

这种不平衡可能出现下面四种情况:

  1. 对a的左儿子的左子树进行一次插入
  2. 对a的左儿子的右子树进行一次插入
  3. 对a的右儿子的左子树进行一次插入
  4. 对a的右儿子的右子树进行一次插入

以上四种情况中,1和4关于a点镜像对称,2和3关于a点镜像对称。因此,理论上只有两种情况,当然,从编程角度来看还是四种情况。

对于1和4,采取单旋操作,以左-左为例
//k2是失衡的节点,k1是其左孩子
static Position SingleRotateWithLeft( Position K2 )
{
  Position K1;
  K1 = K2->Left;
  K2->Left = K1->Right;
  K1->Right = K2;

}
右-右为
//k2是失衡节点,k1是其右孩子
static Position SingleRotateWithRight( Position K2 )
{
  Position K1;
  K1 = K2->Right;
  K2->Right = K1->Left;
  K1->Left = K2;
}
对于2和3,需要采取双选操作,以左儿子有右子树为例
//k3是失衡的节点,k1是其左孩子,k2是k1的右孩子
static Position DoubleRotateWithLeft( Position K3 )
{
    K3->Left = SingleRotateWithRight( K3->Left );

    return SingleRotateWithLeft( K3 );
}
右儿子的左子树被插入
//k3是失衡节点,k1是其右孩子,k2是k1的左孩子
static Position DoubleRotateWithRight( Position K3 )
{
    K3->Right = SingleRotateWithLeft( K3->Right );

    return SingleRotateWithRight( K3 );
}

转载于:https://www.cnblogs.com/evansyang/p/5861805.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值