关闭

AVL Tree(平衡二叉树)

标签: AVL平衡二叉树
336人阅读 评论(0) 收藏 举报
分类:
//AVL_Tree.c

#include <stdio.h>
#include <stdlib.h>

/*-------------------------------------------------------------------------------------
此间的过程阅读一定结合课本(严蔚敏数据结构)中的图示演示!!
--------------------------------------------------------------------------------------*/
#define LH +1   //左高
#define EH 0    //等高
#define RH -1   //右高
typedef int Boolean;
#define TRUE 1
#define FALSE 0

typedef char KeyType;//定义关键字类型
typedef struct{
    KeyType key;
}ElemType;//定义元素类型
typedef struct BSTNode{//定义树的结点类型
    ElemType data;
    int bf;//结点的平衡因子
    struct BSTNode *lchild, *rchild;
}BSTNode, *BSTree;


//data field
BSTree lc,rc,ld,rd;

//此函数用于单向右旋平衡处理
void R_Rotate(BSTree p){
    //对以*p为根的二叉排序树作右旋处理,处理之后*p指向新的树根结点
    //(即旋转处理之前的左子树的根结点)
    lc = p->lchild;//lc指向的*p的左子树根结点
    p->lchild = lc->rchild;//lc的右子树挂接为*p的左子树
    lc->rchild = p;
    p = lc;//p指向新的根结点
}

//此函数用于单向左旋平衡处理
void L_Rotate(BSTree p){
    //对以*p为根的二叉排序树作左旋处理,处理之后p指向新的树根结点
    //(即旋转处理之前的右子树的根结点)
    rc = p->rchild;//rc指向的*p的右子树根结点
    p->rchild = rc->lchild;//rc的左子树挂接为*p的右子树
    rc->lchild = p;
    p = rc;//p指向新的根结点
}

//此函数用于左平衡处理(包括LL,LR型二叉排序树平衡的调整)
void LeftBalance(BSTree T){
    //对以指针T所指结点为根的二叉树作左平衡旋转处理,本算法结束后,指针T指向新的根结点
    lc = T->lchild;//lc指向*T的左子树根结点
    switch (lc->bf){//检查*T的左子树的平衡度,并作相应平衡处理
        case LH:    //新结点插入在*T的左孩子的左子树上,要作单向右旋处理
            T->bf = lc->bf = EH;
            R_Rotate(T);
            break;
        case RH:    //新结点插入在*T的左孩子的右子树上,要作双向旋转处理
            rd = lc->rchild;    //rd指向*T的左孩子的右子树根

            switch (rd->bf){//修改*T及其左孩子的平衡因子
                case LH:
                    T->bf = RH;
                    lc->bf = EH;
                    break;
                case EH:
                    T->bf = lc->bf = EH;
                    break;
                case RH:
                    T->bf = EH;
                    lc->bf = LH;
                    break;
            }
            rd->bf = EH;
            L_Rotate(T->lchild);//对*T的左子树作左旋平衡处理
            R_Rotate(T);//对*T作右旋平衡处理
    }
}


//此函数用于右平衡处理(包括RR,RL型二叉排序树平衡的调整)
void RightBalance(BSTree T){
    //对以指针T所指结点为根的二叉树作右平衡旋转处理,本算法结束后,指针T指向新的根结点
    rc = T->rchild;//rc指向*T的右子树根结点
    switch (rc->bf){//检查*T的右子树的平衡度,并作相应平衡处理
    case LH:    //新结点插入在*T的右孩子的左子树上,要作双向旋转处理
        rd = rc->rchild;    //rd指向*T的右孩子的左子树根

        switch (rd->bf){//修改*T及其右孩子的平衡因子
        case LH:
            T->bf = EH;
            rc->bf = RH;
            break;
        case EH:
            T->bf = rc->bf = EH;
            break;
        case RH:
            T->bf = LH;
            rc->bf = EH;
            break;
        }
        rd->bf = EH;
        R_Rotate(T->rchild);//对*T的右子树作右旋平衡处理
        L_Rotate(T);//对*T作左旋平衡处理

    case RH:    //新结点插入在*T的右孩子的右子树上,要作单向左旋处理
        T->bf = rc->bf = EH;
        L_Rotate(T);
        break;
    }
}


//此函数用于在平衡二叉树中插入一个结点(若出现不平衡,则调整)
int InsertAVL(BSTree T, ElemType e, Boolean taller){
    //若在平衡的二叉排序树T中不存在和e有相同关键字的结点,则插入一个数据元素为e的新结点,并返回1,否则返回0
    //若因插入而使二叉排序树失去平衡,则作平衡旋转处理。布尔变量taller反映T长高与否。

    if (!T){//插入新结点,树“长高”,置taller为TRUE
        T = (BSTree)malloc(sizeof(BSTNode));
        T->data = e;
        T->lchild = T->rchild = NULL;
        T->bf = EH;
        taller = TRUE;
    }
    else{
        if (e.key == T->data.key){//树中已存在和e有相同关键字的结点则不插入
            taller = FALSE;
            return 0;
        }
        if (e.key < T->data.key){//应继续在*T的左子树中搜索
            if (!InsertAVL(T->lchild, e, taller))   return 0;//未插入
            if (taller){
                switch (T->bf){//检查*T的平衡度
                    case LH:    //原本左子树比右子树高,需要作左平衡处理
                        LeftBalance(T);
                        taller = FALSE;
                        break;
                    case EH:    //原本左右子树等高,现因左子树增高而使树增高
                        T->bf = LH;
                        taller = TRUE;
                        break;
                    case RH:    //原本右子树比左子树高,现在左右子树等高
                        T->bf = EH;
                        taller = FALSE;
                        break;
                }
            }
        }
        else{       //应继续在*T的右子树中进行搜索
            if (!InsertAVL(T->rchild, e, taller)) return 0;//未插入
            if (taller){
                switch (T->bf){//检查*T的平衡度
                    case LH:    //原本左子树比右子树高,现左右子树等高
                        T->bf = EH;
                        taller = FALSE;
                        break;
                    case EH:    //原本左右子树等高,现因右子树增高而使树增高
                        T->bf = RH;
                        taller = TRUE;
                        break;
                    case RH:    //原本右子树比左子树高,需要作右平衡处理
                        RightBalance(T);
                        taller = TRUE;
                        break;
                }
            }
        }
    }

    return 1;
}
1
0
查看评论

AVL Tree 平衡二叉树基本插入删除节点功能的实现

简述: 实现AVL 树,主要是两个功能 : 插入某节点和删除某节点 AVL Tree的定义, 1. 是一棵二叉搜索树(故而每个节点是惟一的, 如果出现重复数字会破坏平衡树的算法) 2. 每个节点左右子树的高度之差(平衡因子)相差最多为1 实现: 为了使所得的二叉树为平衡二...
  • anialy
  • anialy
  • 2012-09-18 20:40
  • 10998

平衡二叉树 之 AVL树

AVL树的数据结构以及插入和删除操作实现...
  • whucyl
  • whucyl
  • 2013-12-12 22:22
  • 20852

平衡二叉查找树(AVL)的查找、插入、删除

1.平衡二叉查找树
  • lpp0900320123
  • lpp0900320123
  • 2014-09-18 10:46
  • 5457

【数据结构】平衡二叉树[AVL树](一)——插入

AVL 树是带有平衡条件的二叉查找树,所谓的平衡条件就是每个节点的左子树和右子树的高度最大差别为1。平衡二叉树的实现大部分过程和二叉查找树是一样的,区别在于要时刻保持树的平衡,所以在插入和删除之后要添加一个旋转算法来保持平衡,保持平衡需要借助一个节点高度的属性。 一、AVL 节点 class Av...
  • yeswenqian
  • yeswenqian
  • 2014-03-26 17:37
  • 4392

AVL树(平衡二叉树(Balanced Binary Tree))

转载地址是  http://noalgo.info/661.html AVL树是一种自平衡的二叉查找树(Balanced Binary Tree),由于其任意节点的左右子树的高度差至多为一,查找、插入、删除等操作的复杂度在平均和最坏情况下都是O(log n)。AVL树和红黑树都是平衡...
  • lfdanding
  • lfdanding
  • 2015-06-08 12:57
  • 686

平衡二叉树(Balance Binary Tree) --AVL树

平衡二叉树(Balance Binary Tree)又称AVL树。对二叉查找树做了很大的改进,使得查找的效率真正保证为O(logN),每次插入都保证树必须满足平衡。
  • tanjiquan
  • tanjiquan
  • 2016-02-18 12:08
  • 3222

Javascript数据结构之禅:平衡二叉树(Balanced Binary Tree, AVL Tree)

Javascript数据结构之禅:平衡二叉树(Balanced Binary Tree, AVL Tree)项目源码地址: github.com/KristenXu/JavascriptDatastructures/blob/master/AVLTree.js1 .基本概念AVL树的复杂程度真是比...
  • xc578579786
  • xc578579786
  • 2017-03-03 14:00
  • 669

AVL树详解&面试题-判断一棵树是否是平衡二叉树

上次写了关于二叉搜索树的分析,但是二叉搜索树有一个缺陷,就是当插入一个有序(或接近有序)的序列时,二叉搜索树就相当于一个链表了,搜索效率会特别低。那么,如何来改进呢?这就引入了AVL树(高度平衡二叉树),那么下面我们一起来了解一下AVL树吧! AVL树的特征: 1、左右子树的高度差都不超过1; ...
  • her__0_0
  • her__0_0
  • 2017-06-24 22:57
  • 1260

平衡二叉树(AVL)的插入和删除详解(上)

AVL树维基百科:http://zh.wikipedia.org/wiki/AVL树 在计算机科学中,AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次...
  • sysu_arui
  • sysu_arui
  • 2012-08-22 19:02
  • 15302

AVL树-自平衡二叉查找树(Java实现)

在计算机科学中,AVL树是最先发明的自平衡二叉查找树。AVL树得名于它的发明者 G.M. Adelson-Velsky 和 E.M. Landis,他们在 1962 年的论文 "An algorithm for the organization of information" 中...
  • liyong199012
  • liyong199012
  • 2014-06-07 19:29
  • 8374
    个人资料
    • 访问:193556次
    • 积分:4833
    • 等级:
    • 排名:第7053名
    • 原创:290篇
    • 转载:39篇
    • 译文:0篇
    • 评论:9条
    最新评论