平衡二叉树

原创 2016年08月29日 15:56:56

ACM模版

构建平衡二叉树

#define LH 1
#define EH 0
#define RH -1

//  结点
typedef struct BiTNode
{
    int data;
    int bf;
    struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;

//  右旋
void R_Rotate(BiTree *p)
{
    BiTree L;
    L = (*p)->lchild;
    (*p)->lchild = L->rchild;
    L->rchild = (*p);
    *p = L;
    return ;
}

//  左旋
void L_Rotate(BiTree *p)
{
    BiTree L;
    L = (*p)->rchild;
    (*p)->rchild = L->lchild;
    L->lchild = (*p);
    *p = L;
    return ;
}

//  左边深旋转
void LeftBalance(BiTree *T)
{
    BiTree L, Lr;
    L = (*T)->lchild;

    switch (L->bf)
    {
        case LH:
            (*T)->bf = L->bf = EH;
            R_Rotate(T);            //  右旋即可
            break;
        case RH:
            Lr = L->rchild;
            switch (Lr->bf)
            {
                case LH:
                    (*T)->bf = RH;
                    L->bf = EH;
                    break;
                case EH:
                    (*T)->bf = L->bf = EH;
                    break;
                case RH:
                    (*T)->bf = EH;
                    L->bf = LH;
                    break;
            }
            Lr->bf = EH;
            L_Rotate(&(*T)->lchild);//  先左旋
            R_Rotate(T);            //  后右旋
            break;
    }
    return ;
}

//  右边深旋转
void RightBalance(BiTree *T)
{
    BiTree L, Ll;
    L = (*T)->rchild;

    switch (L->bf)
    {
        case RH:
            (*T)->bf = L->bf = EH;
            L_Rotate(T);            //  左旋即可
            break;
        case LH:
            Ll = L->lchild;
            switch (Ll->bf)
            {
                case LH:
                    (*T)->bf = RH;
                    L->bf = EH;
                    break;
                case EH:
                    (*T)->bf = L->bf = EH;
                    break;
                case RH:
                    (*T)->bf = EH;
                    L->bf = LH;
                    break;
            }
            Ll->bf = EH;
            R_Rotate(&(*T)->rchild);//  先右旋
            L_Rotate(T);            //  后左旋
            break;
    }
    return ;
}

//  插入AVL结点
bool InsertAVL(BiTree *T, int e, bool *taller)
{
    if (!*T)
    {
        *T = (BiTree)malloc(sizeof(BiTNode));
        (*T)->data = e;
        (*T)->lchild = (*T)->rchild = NULL;
        (*T)->bf = EH;
        *taller = true;
    }
    else
    {
        if (e == (*T)->data)    //  已经存在e
        {
            *taller = false;
            return false;
        }
        if (e < (*T)->data)     //  小于data向左递归
        {
            if (!InsertAVL(&(*T)->lchild, e, taller))
            {
                return false;
            }
            switch ((*T)->bf)
            {
                case LH:    //  左边深,插入前需要旋转
                    LeftBalance(T);
                    *taller = false;
                    break;
                case EH:    //  平衡,插入后变为左边深
                    (*T)->bf = LH;
                    break;
                case RH:    //  右边深,插入后变为平衡
                    (*T)->bf = EH;
                    *taller = false;
                    break;
            }
        }
        else                    //  大于data向右递归
        {
            if (!InsertAVL(&(*T)->rchild, e, taller))
            {
                return false;
            }
            switch ((*T)->bf)
            {
                case LH:    //  左边深,插入后变为平衡
                    (*T)->bf = EH;
                    *taller = false;
                    break;
                case EH:    //  平衡,插入后变为右边深
                    (*T)->bf = RH;
                    break;
                case RH:    //  右边深,插入前需要旋转
                    RightBalance(T);
                    *taller = false;
                    break;
            }
        }
    }
    return *taller;
}
版权声明:听说这里让写版权声明~~~

一步一步写平衡二叉树(AVL树)

转载:http://www.cppblog.com/cxiaojia/archive/2012/08/20/187776.html 平衡二叉树(Balanced Binary Tree)...
  • Niteip
  • Niteip
  • 2013年09月20日 08:43
  • 62176

平衡二叉树旋转原理(图示)

/************************************************************************* > File Name: btre...
  • innobase
  • innobase
  • 2016年05月02日 20:21
  • 4595

平衡二叉树详解

平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树...
  • u010442302
  • u010442302
  • 2016年09月30日 20:47
  • 9359

平衡二叉树的实现原理

1.概念 平衡二叉树建立在二叉排序树的基础上,目的是使二叉排序树的平均查找长度更小,即让各结点的深度尽可能小,因此,树中每个结点的两棵子树的深度不要偏差太大。 平衡二叉树的递归定义:平衡二叉树是一棵二...
  • wxbmelisky
  • wxbmelisky
  • 2015年08月18日 18:08
  • 3929

平衡二叉树的实现代码

前面已经讲过平衡二叉树的实现原理以及实例 原理参见 http://blog.csdn.net/wxbmelisky/article/details/47755753      实例参见 http://...
  • wxbmelisky
  • wxbmelisky
  • 2015年08月21日 20:53
  • 2971

平衡二叉树转换

平衡二叉树(Balanced binary tree)是由阿德尔森-维尔斯和兰迪斯(Adelson-Velskii and Landis)于1962年首先提出的,所以又称为AVL树。 定义:平衡二叉...
  • u013076044
  • u013076044
  • 2014年12月17日 12:32
  • 1174

Java判断二叉树是否为平衡二叉树

输入一棵二叉树,判断该二叉树是否是平衡二叉树
  • u014282557
  • u014282557
  • 2017年06月06日 15:25
  • 1377

剑指offer:判断二叉树是不是平衡二叉树(java)

题目:输入一棵二叉树的根节点,判断该树是不是平衡的二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。     有了求二叉树的深度的经验之后再解决这个问题,我们很容易...
  • abc7845129630
  • abc7845129630
  • 2016年10月06日 18:48
  • 3524

平衡二叉树及调整

什么是平衡二叉树,如何调整不平衡?  看了很多人的博客,发现多多少少都有一些错误(被迷惑了很久),最多通过查看维基百科的定义才终于搞懂。 写篇文章记录一下,防止自己忘记。 1. 什么是平衡二叉树?...
  • ch717828
  • ch717828
  • 2015年07月16日 11:13
  • 2090

平衡二叉树的四种调整方式和注意事项

  • chy89224
  • chy89224
  • 2017年02月13日 20:55
  • 297
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:平衡二叉树
举报原因:
原因补充:

(最多只允许输入30个字)