数据结构与算法-二叉排序树

定义

二叉排序树(Binary Sort Tree)或者是一棵空树;或者是具有以下性质的二叉树:
1.若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值;
2.若它的右子树不为空,则右子树上所有结点的值均小于它的根结点的值;
3.它的左右子树也分别为二叉排序树;

二叉排序树又称二叉查找树,它的查找过程与次优二叉树类似。

二叉排序树的查找

Status SearchBST(BiTree T,KeyType key,BiTree f,BiTree &p){
   //若查找不成功p指向最后一个结点,f为其双亲,返回FALSE
   //若查找成功p指向该结点,返回TRUE 
    if(!T){p=f; return FALSE;}
    else if EQ(key,T.data.key) {p=T; return TRUE;}
    else if LT(key,T.data.key){ return SearchBST(T.lchild,key,T,p);}
    else return SearchBST(T.rchild,key,T,p);
}

二叉排序树的插入

Status InsertBST(BiTree T,KeyType key){
    //若插入成功返回TRUE,否则FALSE
    BiTree f,p;
    if(SearchBST(T,key,f,p)) return FALSE;
    else { 
        s=(BiTree)malloc(sizeof(BiNode));
        s->data=key; 
        s->lchild=s->rchild=NULL;
        if(!p) T=s;
        else if LT(key,p->data.key) p->lchild=s;
        else p->rchild=s;
        return TRUE;
    }
}

二叉排序树的删除

普通的二叉树删去一个结点变为森林,没有任何意义,而对于二叉排序树来说删去一个结点只要保证其排序特性即可。
综合来说有三种情形:
1.左右子树均为空,则直接删去结点即可。
2.左子树或者右子树不为空,则用其左子树或者右子树代替即可。
3.左右子树均不为空,则不能简单的处理:
1.用其左子树或者右子树代替,并将原来的左子树或右子树成为其前驱的左子树或右子树。
2.用其直接前驱或者直接后继代替;当用其前驱代替时,将直接前驱的前驱成为直接前驱的双亲的右子树;当用直接后继代替时,将直接后继的后继成为直接后继的双亲的左子树。

void DeleteBST(BiTree &p){
    if(p->lchild==NULL){
        q=p;p=p->rchild;free(q);
    }
    else if(p->rchild==NULL){
        q=p;p=p->lchild;free(q);
    }
    else{
        q=p;p=p->lchild;
        while(p->rchild){
           p=p->rchild;
        }
        q->data=p->data;
        q=p;
        p=p->lchild;
        free(q);
    }//if
}//DeleteBST

二叉排序树的性能分析

二叉查找树查找关键字的过程即为从根结点到该关键字记录结点的路径,查找关键字的个数是路径长度+1,并且不超过树的深度。

在随机情况下,二叉排序树的平均查找长度和logn是等数量级的。

平衡二叉树

定义

平衡二叉树(Balanced Binary Tree或Height-Balanced Tree)又称为AVL树。它或者是一棵空树,或者是具有以下性质的二叉树:
它的左子树和右子树都是平衡二叉树,且左右子树深度只差的绝对值不超过1.

将二叉树结点的平衡因子BF(Balance Factor)定义为该结点左子树深度减去它的右子树深度。

算法

#define LH +1
#define EH 0
#define RH -1
typedef struct{
    ElemType data;
    int bf;
    struct BSTNode *lchild,*rchild;
}BBSTNode,*BBSTree;

void Left_Rotate(BBSTree &p){
    q=p;
    p=p->rchild;
    q->rchild=p->lchild;
    p->lchild=q;
}

void Right_Rotate(BBSTree &p){
    q=p;
    p=p->lchild;
    q->lchild=p->rchild;
    p->rchild=q;
}
void LeftBalance(BBSTree &T){
    switch(T->rchild->bf)
        case RH:
              T->bf=0;
             break;
        case LH:
             Right_Rotate(T->rchild);
            break;
    }//switch
     Left_Rotate(T);
     T->bf=0;
}
void RightBalance(BBSTree &T){
    switch(T->lchild->bf)
        case LH:
              T->bf=0;
            break;
        case RH:
            Left_Rotate(T->lchild);
            break;
    }//switch
     Right_Rotate(T);
     T->bf=0;

}
Status InsertAVT(BBSTree &T,ElemType e,Boolean &taller){
//若平衡二叉树中不存在和e相同的关键字记录,则插入并返回1,否则返回0
//若因插入而使二叉排序树失去平衡,则taller=TRUE;
    if(!T){
        T=(BBSTree)malloc(sizeof(BBSTNode));T->data=e;
        T->lchild=T->rchild=NULL;taller=TRUE;return 1;
    }
    else if EQ(e,T->data) {
        taller=FALSE;
        return 0;
    }
    else if LT(e,T->data){
        if(InsertAVL(T->lchild,e,taller))
            if(taller)
                switch(T->bf){
                    case LH:
                        RightBalance(T);T->bf=0;taller=FALSE;
                        break;
                    case EH:
                        T->bf=LH;taller=TRUE:
                        break;
                    case RH:
                        T->bf=EH;taller=FALSE;
                        break;
        }//switch
    }//if
    else if RT(e,T->data){
        if(InsertAVL(T->lchild,e,taller))
            if(taller)
                switch(T->bf){
                    case LH:
                        T->bf=EH;taller=FALSE;
                        break;
                    case EH:
                        T->bf=RH;taller=TRUE:
                        break;
                    case RH:
                        LeftBalance(T);T->bf=0;taller=FALSE;
                        break;
         }//switch
    }//if
}//InsertAVL

平衡二叉树的性能分析

与二叉排序树相同

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,039评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,223评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,916评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,009评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,030评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,011评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,934评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,754评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,202评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,433评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,590评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,321评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,917评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,568评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,738评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,583评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,482评论 2 352

推荐阅读更多精彩内容

  • 数据结构与算法--从平衡二叉树(AVL)到红黑树 上节学习了二叉查找树。算法的性能取决于树的形状,而树的形状取决于...
    sunhaiyu阅读 7,646评论 4 32
  • 四、树与二叉树 1. 二叉树的顺序存储结构 二叉树的顺序存储就是用数组存储二叉树。二叉树的每个结点在顺序存储中都有...
    MinoyJet阅读 1,528评论 0 7
  • 数据结构与算法--二叉查找树 上节中学习了基于链表的顺序查找和有序数组的二分查找,其中前者在插入删除时更有优势,而...
    sunhaiyu阅读 1,856评论 0 9
  • 1.树(Tree): 树是 n(n>=0) 个结点的有限集。当 n=0 时称为空树。在任意一颗非空树中:有且仅有一...
    ql2012jz阅读 1,004评论 0 3
  • 第一章 绪论 什么是数据结构? 数据结构的定义:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。 第二章...
    SeanCheney阅读 5,766评论 0 19