平衡二叉树

原创 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;
}
版权声明:听说这里让写版权声明~~~ 举报

相关文章推荐

平衡二叉树

为什么需要平衡二叉树?不平衡的二叉排序树的查找效率是非常低的,不平衡的最坏情况就是斜树,查找的时间复杂度是O(n),等同于顺序查找。因此我们在构建时就让这棵二叉排序树是平衡二叉树,此时的查找时间复杂度...
  • wbsbb
  • wbsbb
  • 2014-02-27 19:21
  • 423

二叉平衡树

本文主要介绍二叉平衡树的定义以及它的插入节点工作。 头文件的定义#ifndef AVL_H_ #define AVL_H_ struct AVL; typedef struct AVL *Searc...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

平衡二叉树

#include #include #include #define EQ(a,b) ((a)==(b)) #define LT(a,b)  ((a) #define L...

平衡二叉树

用到才发现已经遗忘了,从网上找了一点资料,写的很不错,转了一下,多谢 平衡二叉树 形态匀称的二叉树称为平衡二叉树 (Balanced binary tree) ,其严格定义是:   一棵...

平衡二叉树

作者:disappearedgod 文章出处:http://blog.csdn.net/disappearedgod/article/details/24422297 时间:2014-4-24

平衡二叉树

#include using namespace std; #include "stdlib.h" #include "stdio.h" ///=======================...

平衡二叉树

平衡二叉树的实现

平衡二叉树

平衡二叉树又称AVL树。它或者是颗空树,或者是具有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。若将二叉树节点的平衡因子BF定义为该节点的左子树的深度...

平衡二叉树

转自:http://www.cnblogs.com/blfshiye/p/4033094.html 平衡二叉树简称平衡树,是由Adelson-Velskii和Landis于196...

平衡二叉树

平衡二叉树又称AVL树。它或者是颗空树,或者是具有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。若将二叉树节点的平衡因子BF定义为该节点的左子树的深度...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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