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