2023年广工数据结构实验报告平衡二叉树.docx
《2023年广工数据结构实验报告平衡二叉树.docx》由会员分享,可在线阅读,更多相关《2023年广工数据结构实验报告平衡二叉树.docx(45页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、度劣与招实验报告课程名称数据结构实验学 院计算机学院专业班级计科9班学 号学生姓名指导教师爰庆2023 年7月 6 日c a se RH: T-bf= L H ; r d -bf= EH; b r ea k ;case EH:T-b f =rd- b f=EH; bre a k ;case L H: T- b f= E H; r d bf=RH; bre a k;)lc-bf=EH;RR o t a t e (T- r c h ild);L _ R o tate( T );bre a k;)/*平衡二叉树的插入操作* /Sta t us Inse r tAVL(BBSTrec &T, Red
2、T ypc e, S t atu s &tallcr)i f (NULL=T) T = (BBS Tree)ma 1 1 oc ( s i zeo f (B BSTNod e );T-data = e;T-bf= EH;T-lch i Id = NULL;T- rchild = NUL L;Jelse if( e =T-d a ta)( 书中已存在和e相等的结点t al 1 e r = FALSE; return FALSE;e 1 se i f (e d ata) if(FALS E =InserlAV L (T-lchild, e, I a 1 ler) r elum FALS E ;if
3、(TRUE= t allcr)swi t ch(T-bf)ca s e LH: Lef t Bala nee (T); tai I er = F A LSE; break;ca s e EH: T-bf = L H; tall e r = TRUE; break;c aseRH:T-b f = EH; ta Iler = FALSE; bre a k;)el s e if ( F ALSE= = Inser t AVL(Trch i Id, e, t a 11 e r) re t urn FALSE;i f (TRUE=taller)swi t c h(T-bf) ca s e LH: T-b
4、f = EH; t a Iler = F ALS E: brea k ;case E H: T-bf = R H; tai 1 er = T RU E; break;ca s c RH: R i ghtBalancc(T); t a 1 ler = F ALS E: br e a k ;return TRUE;)/*平衡二叉树的删除操作*/Status D e lctcAVL(BBS Tree &t, RcdTypc c, Stat u s &sho r tcr)当被删结点是有两个孩子,且其前驱结点是左孩子时,lag=ls t atic int t a g = 0;if( t =NULL)re
5、 t urn FALSE;/假如不存在元素,返回失败else i f (e=t-d a t a ) BBSTNode *q = NULL;/假如该结点只有一个孩子,则将日子树取代该结点if (t-lchild =NULL)q = t ;t = trch i I d ;f r e e (q);sho r te r = TRUE;1else if( t -rch i Id = NULL)q = t;t = t-lc h il d ;f rcc (q);s ho r te r = TRUE;假如被删结点有两个孩子,则找到结点的前驱结点, 并将前驱结点的值赋给该结点,然后删除前驱结点els e q =
6、 t-lc h il d ;whil e (q-rchild)q = q-rc h il d ;It-data = q- data;i f(t-lc h i 1 d - d a t a=q- d ata ) lag = 1;De 1 e t e A VL(t-lch i Id, q-d ata, s h orter);if(tag=l) B BS T re e r = t - r c hi 1 d ;if(NULL=r) t-b f = 0;e 1 s esw i t c h(r- b f) ca s e EH: t -bf=-1 ; brea k ;def a u I t : Righ t
7、Bal a n ce( t ) ; b reak;I) e Isc if(cda t a ) / /左子树中继续查找if(! DeleteAV L (t-l c hild, e , shorter) )re t u r n F ALSE;删除完结点之后,调整结点的平衡因子if (sh o rter& & (tag=0)sw i tch (t-b f )c ase L H :t -bf = EH;s h ort e r = T R UE;break;case EH:t-bf = RH;s h orter = FA L SE;bre a k;/假如本来就是右子树较高,删除之后就不平衡,需要做右平。
8、衡操作case RH:R i g htBalan c e(t);右平衡解决i f(trchil d - b f = EH)sh o r t er = FALSE;e 1 ses h o r ter = TRU E ;b rea k;)else if (c t -d ata)右子树中继续查找if(!De 1 e t eAVL(t-rchild, e , sho rter) re t u r n FA L S E;)删除完结点之后,调整结点的平衡因子i f( s ho r te r & (t a g=0)s wit c h(t- b f)case L H :LeftBal a nc e (t);/
9、左平衡解决if (t-lchi I d-bf = EH) / /注意这里,画图思考一下sh o r t er = F A LS E;e 1 seshone rshone rTRUE;b r eak;case E H :t-bf=LH;sh o rt e r = F A LS E;br e ak;ca s e R H :t -bf = EH;shorte r = TRUE ;br e a k ;)if(ta g =!)i n t depth L e ft = BB S T r ccDcpth( t - 1 child);in t dep t hR i gh t = BBSTreeDep t h
10、( t -rch i Id);tbf = de p t hLcf t - dep t hRig h t;)retur n TRUE;)/*平衡二叉树的直找操作*/BBSTre e ScarchAV L (BBSTrce T, R c dT y pc c) i f (T=NULL) r e turn NULL;i f (e= T -data)relur n T;Jelse i f( e T-da t a)return S earchAVL(T-r c hil d , e); else r etur n Searc h AVL(T-lchild, e );)/*获取输入存到数组a*/A r ray
11、 Ge t I n putToAr r a y() Arr a y head, p, q;char k;h cad = p = q = NU L L;i n t m;i f (k ! = n)sea np =(Ar r a yNode*)m a 1 1 oc(si z e of(Arr ayNode);h e ad = p ;p-data = m;k = g etchar();)whilc( k ! =n)scanf(%d,&m);q = (Array N ode* )m a 1 1 o c( s izcof (Array No d c);q-d a t a = m;p- n ex tq;p
12、- n e x t ;k = g e tch a r ();i f (p!=NULL)p-n e xt = NU L L ;)r etur n head: 返回存放数据的头指针)/*根据输入的字符串建一棵平衡二叉树文/B B ST r ee M a keBBS Tree ( )i nt i=0;S ta t us ta 1 le r = T RUE;BBS Tree T = NULL;Ar r ay a;a = G etl n p u tT o A r ray ();while (a! = N ULL) tai 1 er = TRUE;InsertAVL (T, a -da t a, t a
13、Iler);a = a -nex t ;r etu r n T;/*递归先序遍历*/Status Pre 0 r d e r _ R e c T ra v e rs e (BBS T re e T)if(NULL=T) r et u rn OK;prin t f(% d , T-data);P r eOrd e r_ R ecTra v er s e( T - 1 c hi 1 d); PreOrder_Re c Tr a ver s e(Trchild);)/*递归中序遍历*/St a t us I nOrder_RecTrav e rse(BBSTre e T) if(T-lchild)I
14、 nOrder_RecTraverse(T-| c hi 1 d); printf(%d ,T- d ata);if(T-rchild)I n 0 rd e r_R e c T raver s e (T r c h i 1 d);)/*递归后序遍历*/Statu s LastOr d er_RecTr a ver s e( B B S Tree T) if(T-child)La s tO r der_RecTrave r se(T-l c h i Id);if( T -rch i 1 d )L a stOr d er_RecTravers e (T-r c h i 1 d);pri n tf(
15、%d , T-Adata);)/*找到最左结点* /BBST rce G o F a r L e f t(BBSTr e e T, LS tack&S) if(NULL=T) r eturn NU LL;wh i 1 e(T lchild!= NULL) P u sh_LS(S, T);T = T-l c hil d :)return T;)/*非递归中序遍历*/void InO r d e r Tra v ers e _ I (B BSTr e e T)L Sta c k S;InitSta c k_L S ( S );BB STreep = NULL;p = GoFa r Le f t(
16、T, S);w hile(p !=NULL)print f (%d ”, p- d a t a);if(p- r child!=NULL)p = GoFa r L eft( p - r ch i 1 d, S);Ie 1 se if(St a ck E mpty_L S (S)!=TRU E) P o p_ L S (S, p);e Is e p = N U L L;BBST r ee V i sitFarL e ft( B BSTr e e T,LSta ck&S) if(NULL=T) r et u rn NULL;假如 T 为空,则返回空prin t f(%d ,T-d a ta);先序
17、,先读取结点数据wh i le(T-lch i ld!=NULL)Push_LS(S, T);/入栈T = T- 1 c h ild;/遍历下一个左子树print f(%d T-d a t a);下一个结点的读取数据)r ct u r n T;/*非递归先序遍历*/v o id PreOrderTr a veseI(BBSTre e T)L S tack S ;InitSt a ck_LS (S);BBSTre e p;p= VisitFarLeft(T, S) ;/先将左边的数据先序读取whil e(p! =NULL) if ( P -rc h i 1 d! = NUL L)/假如最左下结点
18、的右子树不为空p = V i s itFarLeft (p-r c h ild, S);/执行遍历该结点的左子树else i f (Sta c kEmp t y_LS!=TRU E ) Pop_LS(S,p); /假如S不为空栈,出栈else p = NULL: /假如为空栈,p赋予空 ) )/*非递归后序遍历文/vo i d L a st 0 rder T rave s eI (BB STr e e r oot)BBS T ree p = root;BB S Tree s t ac k 30;i n t num=0;B BST r e e have_vis i ted = NULL;whil
19、e(NULL!=p|num 0 )while (NULL! =p)st a c k n u m+= p ;p=p-l c hild;)p = s tacknum-l;if( N ULL=p-rc h il d | I hav e _vi s ited=p- r c h i 1 d) p r intf(% d , p d ata);n u m;h av e _v i sited=p;p二NULL;)e 1 s e (p=p- r c hil d ;)pr i ntf(n);)/*非递归层次遍历输出一棵二叉树*/voi d Leve 1 OrederTra v e rse_P r i n t (
20、B B STr e e T) jf(T=NULL)pri n t f(The tree is em p t y!);if (T!=NULL) LQ u eue Q;InitQue u e _LQ(Q);BBS Tree p = T;printf (% d ,p- d ata);EnQ u eue_LQ ( Q, p );w h i 1 e (D e Q ueue_LQ(Q, p ) i f (p-lchild !=NULL) p r i n tf( %d ”, p- 1 chi 1 d-data);EnQueu e _LQ( Q, p-l c h ild);)if(p-rchild!=NULL
21、)printf( %d , p-rc h i 1 d- d ata);E nQueue_L Q (Q, p-r c hild);)/*括号表达法输出平衡二叉树*/void BraNota t io n P r int (BBS Tree T)if(NULL=T)prin t f( 空!) e lscif(T!=NULL)if(T!=NULL)pr i n t f ( % i , T-data);if(T-lch i ld|T- r child) printf(T);)if(T-l child I I T-rchi 1 d )i f(T- 1 child) BraNota t i o nPrin
22、t (Tlc h i 1 d ): e 1 s e if(Trchild) printf( #);)printf ;if(T一)rc h i Id ) BraNo t a t i o n P rint (T-rc h i Id);)elseif(P 1 ch i Id) prin t f ( #);)pr i ntf (T);)/*将一棵树转换为一个数组*/Array GetArrayF romTree( B BST r e e T) S t a lus f i r stT ime = TRU E;Ar r ay head = NULL;Array Node *b = NULL;A r ray
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2023 年广工 数据结构 实验 报告 平衡 二叉
限制150内