zoukankan      html  css  js  c++  java
  • 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 );
    }
    
    
  • 相关阅读:
    [PyJs系列介绍]一、从commonjs和seajs说起
    [PyJs系列介绍]五、回顾及展望
    [PyJs系列介绍]三、编译与上线
    url decode problem
    [PyJs系列介绍]二、缘起和核心概念
    ControlJS介绍
    css,javascript的预加载
    [PyJs系列介绍]四、代理与插件
    webservice上传图片
    提高IIS7并发连接数
  • 原文地址:https://www.cnblogs.com/evansyang/p/5861805.html
Copyright © 2011-2022 走看看