数据结构学习笔记(12)----平衡二叉排序树

定义:
  1. 左子树与右子树的高度之差的绝对值小于等于1
  2. 左右子树也是平衡二叉树
    a.平衡因子定义: 节点的左子树与右子树的深度之差**
    例如:《数据结构学习笔记(12)----平衡二叉排序树》 《数据结构学习笔记(12)----平衡二叉排序树》
平衡树的平衡方法:

(1)LL型
《数据结构学习笔记(12)----平衡二叉排序树》

            B = A->lchild;
            A->lchild = B->rchild;
            B->rchild = A;
            A->bf = 0;
            B->bf = 0;
            if ( FA == NULL )
            {
                *root = B;
            }
            else if (A == FA->lchild )
            {
                FA->lchild = B;
            }
            else
            {
                FA->rchild = B;
            }

(2)LR型
《数据结构学习笔记(12)----平衡二叉排序树》

    B = A->lchild;
            PAVLNode C = B->rchild;
            B->lchild = C->lchild;
            A->lchild = C->rchild;
            C->lchild = B;
            C->rchild = A;
            if (key > C->key)
            {
                A->bf = 0;
                B->bf = 1;
                C->bf = 0;
            }
            if (key < C->key)
            {
                A->bf = -1;
                B->bf = 0;
                C->bf = 0;
            }
            if (FA == NULL)
            {
                *root = C;
            }
            else if (FA->lchild == A)
            {
                FA->lchild = C;
            }
            else
            {
                FA->rchild = C;
            }

(3)RR 型
《数据结构学习笔记(12)----平衡二叉排序树》

    B = A->rchild;
            A->rchild = B->lchild;
            B->lchild = A;
            A->bf = 0;
            B->bf = 0;
            if (FA == NULL)
            {
                *root = B;
            }
            else if (FA->lchild == A)
            {
                FA->lchild = B;
            }
            else
            {
                FA->rchild = B;
            }

(4)RL 型
《数据结构学习笔记(12)----平衡二叉排序树》

B = A->rchild;
            PAVLNode C = B->lchild;
            A->rchild = C->lchild;
            B->lchild = C->rchild;
            C->lchild = A;
            C->rchild = B;
            if (C->key < key)
            {
                A->bf = 1;
                B->bf = 0;
                C->bf = 0;
            }
            else
            {
                A->bf = 0;
                B->bf = -1;
                C->bf = 0;
            }
                        if (FA == NULL)
            {
                *root = C;
            }
            else if (FA->lchild == A)
            {
                FA->lchild = C;
            }
            else
            {
                FA->rchild = C;
            }
平衡树建立方法:
  1. 查找应插入位置,同时记录距离插入位置最近的可能失衡点A(A的平衡因子不等于0)
  2. 插入新节点S
  3. 确定节点B,并修改A的平衡因子,
  4. 修改从B到S路径上的个节点的平衡因子(原值必为0)
  5. 根据A,B的平衡因子判断失衡以及失衡类型,并做相应处理
    代码实现:
typedef struct tree
{
    int bf;//平衡因子
    int key;//键值
    struct tree * lchild;//左孩子
    struct tree * rchild;//右孩子
}AVLNode,*PAVLNode;

void inser_AVLTree(PAVLNode * root, int key)
{
    PAVLNode fa = NULL, p = *root, A = *root,B = NULL, fp = NULL,FA = NULL;
    PAVLNode pNew = new AVLNode;
    pNew->bf = 0;
    pNew->key = key;
    pNew->lchild = pNew->rchild = NULL;
    //判断是否为空
    if (NULL == *root)
    {
        (*root) = pNew;
    }
    /*如果不为空则进行插入*/
    else
    {
        /*查找插入点fp*/
        while (p)
        {
            /*找到距离插入位置最近的可能失衡点A(A的平衡因子不等于0)*/
            if ( p->bf != 0 )
            {
                A = p;
                FA = fp;
            }
            fp = p;
            if (p->key < key)
            {
                p = p->rchild;
            }
            else
            {
                p = p->lchild;
            }
        }
        /*插入pNew*/
        if (fp->key > key)
        {
            fp->lchild = pNew;
        }
        else
        {
            fp->rchild = pNew;
        }
        /*调节平衡因子*/
        if (key > A->key)
        {
            B = A->rchild;
            A->bf -= 1;
        }
        if (key < A->key)
        {
            B = A->lchild;
            A->bf += 1;
        }
        /*修改pNew 到 A路径上的平衡因子*/
        p = B;
        while (p != pNew)
        {
            if (p->key < key)
            {
                p->bf = -1;
                p = p->rchild;
            }
            else
            {
                p->bf = 1;
                p = p->lchild;
            }
        }
        /*判断失衡并做相应处理*/
        //LL型
        if (A->bf == 2 && B->bf == 1)
        {
            B = A->lchild;
            A->lchild = B->rchild;
            B->rchild = A;
            A->bf = 0;
            B->bf = 0;
            if ( FA == NULL )
            {
                *root = B;
            }
            else if (A == FA->lchild )
            {
                FA->lchild = B;
            }
            else
            {
                FA->rchild = B;
            }
        }
        //LR型
        else if (A->bf == 2 && B->bf == -1)
        {
            B = A->lchild;
            PAVLNode C = B->rchild;
            B->lchild = C->lchild;
            A->lchild = C->rchild;
            C->lchild = B;
            C->rchild = A;
            if (key > C->key)
            {
                A->bf = 0;
                B->bf = 1;
                C->bf = 0;
            }
            if (key < C->key)
            {
                A->bf = -1;
                B->bf = 0;
                C->bf = 0;
            }
            if (FA == NULL)
            {
                *root = C;
            }
            else if (FA->lchild == A)
            {
                FA->lchild = C;
            }
            else
            {
                FA->rchild = C;
            }
        }
        //RL型
        else if (A->bf == -2 && B->bf == 1)
        {
            B = A->rchild;
            PAVLNode C = B->lchild;
            A->rchild = C->lchild;
            B->lchild = C->rchild;
            C->lchild = A;
            C->rchild = B;
            if (C->key < key)
            {
                A->bf = 1;
                B->bf = 0;
                C->bf = 0;
            }
            else
            {
                A->bf = 0;
                B->bf = -1;
                C->bf = 0;
            }
                        if (FA == NULL)
            {
                *root = C;
            }
            else if (FA->lchild == A)
            {
                FA->lchild = C;
            }
            else
            {
                FA->rchild = C;
            }
        }
        //RR型
        else if (A->bf == -2 && B->bf == -1)
        {
            B = A->rchild;
            A->rchild = B->lchild;
            B->lchild = A;
            A->bf = 0;
            B->bf = 0;
            if (FA == NULL)
            {
                *root = B;
            }
            else if (FA->lchild == A)
            {
                FA->lchild = B;
            }
            else
            {
                FA->rchild = B;
            }
        }
    }
}
举例

已知如下所示长度为12的表 (5,4,8,1,9,7,6,2,12,11,10,3)按所给顺序构造二叉平衡树
《数据结构学习笔记(12)----平衡二叉排序树》

    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/qq_36675830/article/details/78234874
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞