平衡二叉树所涉及的一些算法
生活随笔
收集整理的這篇文章主要介紹了
平衡二叉树所涉及的一些算法
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
今晚整那個(gè)ubuntu,什么也沒(méi)弄成,唉,把算法先保留一下吧, 插入函數(shù)還沒(méi)理解透徹呢
#include<stdio.h> #include<stdlib.h>#define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define NULL 0typedef int Status; typedef int ElemType; typedef int KeyType;typedef struct BSTNode{ElemType data;int bf; //結(jié)點(diǎn)平衡因子BSTNode *lchild, *rchild; //左右孩子指針 }BSTNode, *BSTree;Status InitBSTree(BSTree &BT) //初始化 {//操作結(jié)果:構(gòu)造一個(gè)空的動(dòng)態(tài)查找表BTBT=NULL;return OK; }//InitBSTreeStatus DestroyBSTree(BSTree &BT) //銷(xiāo)毀 {//初始條件:動(dòng)態(tài)表已經(jīng)存在。操作結(jié)果:銷(xiāo)毀動(dòng)態(tài)查找表BTif(BT) //非空樹(shù){if(BT->lchild) //有左孩子DestroyBSTree(BT->lchild); //遞歸法銷(xiāo)毀左孩子子樹(shù)if(BT->rchild) //有右孩子DestroyBSTree(BT->rchild); //遞歸法消去右孩子子樹(shù)free(BT); //釋放根結(jié)點(diǎn)BT=NULL;}//ifreturn OK; }//DestroyBSTreeBSTree SearchBSTree(BSTree T, KeyType key) //查找 {//在根指針T所指平衡二叉樹(shù)中遞歸地查找某關(guān)鍵字等于key的數(shù)據(jù)元素//若查找成功,則返回指向該數(shù)據(jù)元素結(jié)點(diǎn)的指針,否則返回空指針。if(!T){if(key == T->data)return T; //查找結(jié)束;else if(key < T->data)return SearchBSTree(T->lchild, key); //在左子樹(shù)中查找else if(key > T->data)return SearchBSTree(T->rchild, key); //在右子樹(shù)中查找}//if }//SearchBSTreeStatus R_Rotate(BSTree &p) //右旋 {//對(duì)以*p為根的二叉樹(shù)作右旋處理,處理之后p指向新的樹(shù)根結(jié)點(diǎn),//即指向處理前的左子樹(shù)的根結(jié)點(diǎn)(p的左孩子結(jié)點(diǎn))BSTree lc;lc=p->lchild; //lc指向左子樹(shù)的根結(jié)點(diǎn)p->lchild = lc->rchild; //lc的右子樹(shù)掛接為p的左子樹(shù)lc->rchild =p;p=lc; //p指向新的根結(jié)點(diǎn)return OK; }//R_RotateStatus L_Rotate(BSTree &p) //左旋 {BSTree rc;rc=p->rchild;p->rchild = rc->lchild;rc->lchild=p;p=rc;return OK; }//L_Rotate#define LH +1 //左高 #define EH 0 //等高 #define RH -1 //右高Status LeftBalance(BSTree &T) //左平衡旋轉(zhuǎn)處理 {//對(duì)以指針T所指結(jié)點(diǎn)為根的二叉樹(shù)作左平衡處理,//T指向新根結(jié)點(diǎn)BSTree lc, rd;lc=T->lchild; //lc指向*T的左子樹(shù)根結(jié)點(diǎn)switch(lc->bf){//檢查*T的左子樹(shù)的平衡度,并作相應(yīng)處理case LH://新結(jié)點(diǎn)插入在*T的左子樹(shù)上,要做單右旋處理T->bf = lc->bf = EH;R_Rotate(T);break;case RH://新結(jié)點(diǎn)插入在*T的左孩子的右子樹(shù)上,要做雙旋處理rd=lc->rchild; //rd指向*T的左孩子的右子樹(shù)根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;}//switchrd->bf=EH;L_Rotate(T->lchild);//對(duì)*T的左子樹(shù)做左旋平衡處理R_Rotate(T); //對(duì)*T做右旋處理}//switchreturn OK; }//LeftBalanceStatus RightBalance(BSTree &T) //右平衡旋轉(zhuǎn)處理 {//對(duì)以T所指向的結(jié)點(diǎn)為根二叉樹(shù)做右平衡處理,//T指向新的根結(jié)點(diǎn)BSTree rc, rd;rc=T->rchild; //rc指向T的右子樹(shù)根結(jié)點(diǎn)switch(rc->bf){//檢查*T的右子樹(shù)的平衡度,并作相應(yīng)平衡處理case RH: //新結(jié)點(diǎn)插入在右子樹(shù)右子樹(shù)上,單向左旋T->bf=rc->bf=EH;L_Rotate(T);break;case LH: //新結(jié)點(diǎn)插入在右子樹(shù)的左子樹(shù)上,雙選處理rd=rc->lchild;//rd指向右子樹(shù)的座子樹(shù)根switch(rd->bf){//修改*T及其右孩子的平衡因子case RH: T->bf=LH;rc->bf=EH;break;case EH: T->bf=rc->bf=EH;break;case LH: T->bf=EH;rc->bf=RH;}//switchrd->bf=EH;R_Rotate(T->rchild);//右子樹(shù)右旋L_Rotate(T); //對(duì)*T作左旋平衡處理}//switchreturn OK; }//RightBalanceStatus InsertElem(BSTree &T, ElemType e, Status &taller) {//若不存在e則插入,返回1;否則返回0;若插入后失衡,則作相應(yīng)平衡處理//taller記錄樹(shù)長(zhǎng)高與否if(!T){//插入新結(jié)點(diǎn)樹(shù)長(zhǎng)高,則置taller為T(mén)RUET=(BSTree)malloc(sizeof(BSTNode));T->data=e;T->lchild=T->rchild=NULL;T->bf=EH;taller=TRUE;}else{if(e == T->data){//存在相同結(jié)點(diǎn),則不插入taller=FALSE;return FALSE;}//ifif(e < T->data){//應(yīng)繼續(xù)在T的左子樹(shù)中搜索if(!InsertElem(T->lchild, e, taller))//未插入return FALSE;if(taller) //已插入,且左子樹(shù)長(zhǎng)高{switch(T->bf)//檢查*T的平衡度{case LH://原本左高,需左平衡處理LeftBalance(T);taller=FALSE;break;case EH: //原本等高,左增高則樹(shù)增高T->bf=LH;taller=TRUE;break;case RH: //原本右高,則左右等高taller=FALSE;}//switch}//ifelse{//應(yīng)在T的右子樹(shù)中搜索if(!InsertElem(T->rchild, e, taller))//未插入return FALSE;if(taller){switch(T->bf)//檢查T(mén)的平衡度{case LH: T->bf=EH;taller=FALSE;break;case EH: T->bf=RH;taller=TRUE;break;case RH: RightBalance(T);taller=FALSE;}}}}}return OK;}
?
轉(zhuǎn)載于:https://www.cnblogs.com/java0721/archive/2011/12/06/2602924.html
總結(jié)
以上是生活随笔為你收集整理的平衡二叉树所涉及的一些算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Object-C 入门
- 下一篇: 爱迪生欺骗了世界! ----马云给雅虎员