版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 算 法 與 數(shù) 據(jù) 結(jié) 構(gòu)</p><p> 課 程 設(shè) 計(jì) 報(bào) 告</p><p> 題 目: AVLree的實(shí)現(xiàn)及分析</p><p><b> 班 級: </b></p><p><b> 學(xué) 號: </b></p><p
2、><b> 姓 名: </b></p><p><b> 成 績:</b></p><p> 2013年 12月31日</p><p> 一、AVLree的實(shí)現(xiàn)及分析</p><p> AVL 樹是平衡的二元查找樹。一株平衡的二元查找樹就是指對其每一個(gè)節(jié)點(diǎn),其左子樹和右
3、子樹的高度只差不超過1.</p><p> 編寫程序?qū)崿F(xiàn)AVL樹的判別;并實(shí)現(xiàn)AVL樹的ADT,包括其上的基本操作;節(jié)點(diǎn)的加入和刪除。BSt和AVL的差別就在平衡性上,所以AVL的操作關(guān)鍵要考慮如何在保持二元查找樹定義條件下對二元樹進(jìn)行平衡化。</p><p> 編寫AVL樹的判別程序,并判別一個(gè)人元查找數(shù)是否為AVL樹。二元查找樹用其先序遍歷結(jié)果表示,如:5,2,1,3,7,8.&l
4、t;/p><p> 實(shí)現(xiàn)AVL樹的ADT,包括其上的基本操作:節(jié)點(diǎn)的加入和刪除,另外包括將一般二元查找樹轉(zhuǎn)變?yōu)锳VL樹的操作。</p><p> 二、設(shè)計(jì)思想(宋體,三號加粗)</p><p> 任意給定一組數(shù)據(jù),設(shè)計(jì)一個(gè)算法,建立一棵平衡二叉樹,對它進(jìn)行查找、插入、刪除等操作。平衡二叉樹ADT結(jié)構(gòu)如下:</p><p> typedef
5、 struct{</p><p> Status key;</p><p> }ElemType;</p><p> typedef struct BSTNode{</p><p> ElemType data;</p><p> Status bf;</p><p> struct
6、 BSTNode *lchild,*rchild;</p><p> }BSTNode,*BSTree;</p><p><b> 給出一組數(shù)據(jù),通過</b></p><p> InsertAVL(BSTree &T, ElemType e, Status &taller)插入算法,構(gòu)建平衡二叉樹,若在平衡的二叉排序樹T中
7、不存在和e有相同關(guān)鍵字的結(jié)點(diǎn),則插入一個(gè)數(shù)據(jù)元素為e的新結(jié)點(diǎn),并返回1,否則返回0。若因插入而使二叉排序樹失去平衡,則作平衡旋轉(zhuǎn)處理,布爾變量taller反映T長高與否。</p><p> 在此算法中,利用到遞歸算法和</p><p> LeftBalance(BSTree &T)左平衡處理,RightBalance(BSTree &T)右平衡處理。進(jìn)而實(shí)現(xiàn)構(gòu)建平衡二叉
8、樹,使其左子樹和右子樹的高度之差不超過1.</p><p> LeftBalance(BSTree &T)對以指針T所指結(jié)點(diǎn)為根的二叉樹作左平衡旋轉(zhuǎn)處理。本算法結(jié)束時(shí),指針T指向新的根結(jié)點(diǎn)。</p><p> RightBalance(BSTree &T)// 對以指針T所指結(jié)點(diǎn)為根的二叉樹作右平衡旋轉(zhuǎn)處理。本算法結(jié)束時(shí),指針T指向新的根結(jié)點(diǎn)。</p>&
9、lt;p> R_Rotate(BSTree &p) 對以*p為根的二叉排序樹作右旋處理,處理之后p指向新的樹根結(jié)點(diǎn),即旋轉(zhuǎn)處理之前的左子樹的根結(jié)點(diǎn)</p><p> L_Rotate(BSTree &p) 對以p↑為根的二叉排序樹作左旋處理,處理之后p指向新的樹根結(jié)點(diǎn),即旋轉(zhuǎn)處理之前的右子樹的根結(jié)點(diǎn)</p><p> 存在一個(gè)平衡二叉樹,通過DeleteBST(
10、BSTree &T, Status key)和Delete(BSTree &p)實(shí)現(xiàn)刪除節(jié)點(diǎn)操作;</p><p> Delete(BSTree &p)從二叉排序樹中刪除結(jié)點(diǎn)p,并重接它的左或右子樹。</p><p> DeleteBST(BSTree &T, Status key)若二叉排序樹T中存在關(guān)鍵字等于key的數(shù)據(jù)元素時(shí),則刪除該數(shù)據(jù)元素結(jié)
11、點(diǎn)p,并返回TRUE;否則返回FALSE。</p><p> 存在一個(gè)平衡二叉樹,通過SearchBST(BSTree T, Status key, BSTree f, BSTree &p)實(shí)現(xiàn)查找節(jié)點(diǎn)操作;</p><p> SearchBST(BSTree T, Status key, BSTree f, BSTree &p)在根指針T所指二叉排序樹中遞歸地查找其關(guān)
12、鍵字等于key的數(shù)據(jù)元素,若查找成功,則指針p指向該數(shù)據(jù)元素結(jié)點(diǎn),并返回TRUE,否則指針p指向查找路徑上訪問的最后一個(gè)結(jié)點(diǎn)并返回FALSE,指針f指向T的雙親,其初始調(diào)用值為NULL。</p><p> 存在一個(gè)二元排序樹或二元查找樹通過Balance(BSTree T)算法判斷是否為AVL樹,</p><p> Balance(BSTree T)遞歸判斷是不是平衡二叉樹。</
13、p><p> 三、軟件結(jié)構(gòu)圖及流程圖(宋體,三號加粗)</p><p><b> 主函數(shù)流程圖:</b></p><p><b> 12</b></p><p><b> 34</b></p><p><b> 0</b>
14、</p><p> 構(gòu)建AVL樹和插入結(jié)點(diǎn)流程圖:</p><p><b> 否</b></p><p><b> 是</b></p><p> 是否</p><p><b> 查找函數(shù)流程圖:</b></p>
15、<p><b> 刪除函數(shù)流程圖:</b></p><p> 四、測試(宋體,三號加粗)</p><p> 創(chuàng)建AVL樹,輸入一組數(shù)據(jù):</p><p><b> 按先序遍歷輸出:</b></p><p> 刪除節(jié)點(diǎn)7;先序遍歷結(jié)果:</p><p>
16、 插入數(shù)據(jù)6后的先序遍歷結(jié)果:然后退出子目錄操作。</p><p> 輸入一組數(shù)據(jù)創(chuàng)建BST樹,</p><p> 判斷創(chuàng)建的BST是否為AVL樹:</p><p> 創(chuàng)建的BST樹不是AVL樹,將BST轉(zhuǎn)換為AVL樹</p><p> 五、源程序(宋體,三號加粗)</p><p><b> 函數(shù)頭
17、代碼</b></p><p> #include "iostream.h"</p><p> #include <stdio.h></p><p> #include <malloc.h></p><p> #define MAXNODE 100</p><p
18、> #define TRUE 1</p><p> #define FALSE 0</p><p> #define OVERFLOW 1</p><p> #define LH +1</p><p> #define EH 0</p><p> #define RH -1</p>&
19、lt;p> typedef int Status;</p><p> typedef char TElemType;</p><p> typedef struct</p><p><b> {</b></p><p> Status key;</p><p> }ElemTyp
20、e;</p><p> typedef struct BSTNode</p><p><b> {</b></p><p> ElemType data;</p><p> Status bf;</p><p> struct BSTNode *lchild,*rchild;</p
21、><p> }BSTNode,*BSTree;</p><p> Status SearchBST(BSTree T, Status key, BSTree f, BSTree &p) { </p><p> // 算法9.5(b)</p><p> // 在根指針T所指二叉排序樹中遞歸地查找其關(guān)鍵字等于key的數(shù)據(jù)元素,<
22、;/p><p> // 若查找成功,則指針p指向該數(shù)據(jù)元素結(jié)點(diǎn),并返回TRUE,</p><p> // 否則指針p指向查找路徑上訪問的最后一個(gè)結(jié)點(diǎn)并返回FALSE,</p><p> // 指針f指向T的雙親,其初始調(diào)用值為NULL</p><p> if (!T) { p = f; return FALSE; }
23、 // 查找不成功</p><p> else if (key==T->data.key) { p = T; return TRUE; } // 查找成功</p><p> else if (key<T->data.key) </p><p> return SearchBST(T->lchild, key, T,
24、 p); // 在左子樹中繼續(xù)查找</p><p><b> else </b></p><p> return SearchBST(T->rchild, key, T, p); // 在右子樹中繼續(xù)查找</p><p> } // SearchBST</p><p> Status InsertBS
25、T(BSTree &T, ElemType e) { // 算法9.6</p><p> // 當(dāng)二叉排序樹T中不存在關(guān)鍵字等于e.key的數(shù)據(jù)元素時(shí),</p><p> // 插入e并返回TRUE,否則返回FALSE</p><p> BSTree p,s;</p><p> if (!SearchBST(T, e.key
26、, NULL, p)) { // 查找不成功</p><p> s = (BSTree)malloc(sizeof(BSTNode));</p><p> s->data = e; s->lchild = s->rchild = NULL; </p><p> if (!p) T = s; // 插入 s 為新的根結(jié)點(diǎn)&
27、lt;/p><p> else if (e.key<p->data.key) p->lchild=s; // 插入s為左孩子</p><p> else p->rchild = s; // 插入 s 為右孩子</p><p> return TRUE;</p><p> } else return FALSE;
28、 // 樹中已有關(guān)鍵字相同的結(jié)點(diǎn),不再插入</p><p> } // Insert BST</p><p> Status CreateBST(BSTree &T)//將輸入的一組數(shù)據(jù),創(chuàng)建為二叉排序樹</p><p><b> {</b></p><p> Status num;</p>
29、<p> ElemType e;</p><p> cout<<"請輸入二叉排序樹結(jié)點(diǎn)數(shù):"<<endl;</p><p><b> cin>>num;</b></p><p> while(num!=0)</p><p><b>
30、 {</b></p><p> cout<<"請輸入結(jié)點(diǎn)值:"<<endl;</p><p> cin>>e.key;</p><p> InsertBST(T,e);//按二叉排序樹插入方法;</p><p><b> num--;</b>&l
31、t;/p><p><b> }</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> Status max(Status lchild,Status rchild)//取較大的值返回</p>&l
32、t;p><b> {</b></p><p> if(lchild>rchild)</p><p> return lchild;</p><p><b> else</b></p><p> return rchild;</p><p><b&g
33、t; }</b></p><p> Status Depth_bt(BSTree T)//求二叉樹深度</p><p><b> {</b></p><p> if (T==NULL) return 0;</p><p> return 1+max(Depth_bt(T->lchild),De
34、pth_bt(T->rchild));</p><p><b> }</b></p><p> Status Balance(BSTree T)//遞歸判斷是不是平衡二叉樹</p><p><b> {</b></p><p> Status bl,br;</p><
35、;p> if (T==NULL) return 1;//空樹輸出是平衡二叉樹</p><p> bl=Depth_bt(T->lchild);//將左子樹的深度賦值給bl</p><p> br=Depth_bt(T->rchild);//將右子樹的深度賦值給br</p><p> if (bl-br>1||br-bl>1)re
36、turn 0;//如果不滿足平衡二叉樹的定義返回錯(cuò)誤信息</p><p> return Balance(T->lchild)&&Balance(T->rchild);//遞歸調(diào)用</p><p><b> }</b></p><p> Status n=0;</p><p> voi
37、d N_PreOrderAVL(BSTree T)//先序遍歷(根,左,右)</p><p><b> {</b></p><p><b> if (T)</b></p><p><b> {</b></p><p> cout<<" "
38、;<<T->data.key;</p><p><b> n++;</b></p><p> N_PreOrderAVL(T->lchild);</p><p> N_PreOrderAVL(T->rchild);</p><p><b> }</b></
39、p><p><b> }</b></p><p> Status k_ey[40],k=0;</p><p> void Key_PreOrderAVL(BSTree T)//先序遍歷(根,左,右)</p><p><b> {</b></p><p><b>
40、 if (T)</b></p><p><b> {</b></p><p><b> if(k<n)</b></p><p><b> {</b></p><p> k_ey[k]=T->data.key;</p><p&
41、gt;<b> k++;</b></p><p><b> }</b></p><p> Key_PreOrderAVL(T->lchild);</p><p> Key_PreOrderAVL(T->rchild);</p><p><b> }</b>
42、</p><p><b> }</b></p><p> int PreorderAVL(BSTree T)</p><p><b> {</b></p><p><b> if (T)</b></p><p><b> {</
43、b></p><p> cout<<T->data.key<<" ";</p><p> PreorderAVL(T->lchild);</p><p> PreorderAVL(T->rchild);</p><p><b> }</b>&l
44、t;/p><p><b> return 1;</b></p><p><b> }</b></p><p> void R_Rotate(BSTree &p) { // 算法 9.9</p><p> // 對以*p為根的二叉排序樹作右旋處理,處理之后p指向新的樹根結(jié)點(diǎn),</
45、p><p> // 即旋轉(zhuǎn)處理之前的左子樹的根結(jié)點(diǎn)</p><p> BSTree lc;</p><p> lc = p->lchild; // lc指向*p的左子樹根結(jié)點(diǎn)</p><p> p->lchild = lc->rchild; // lc的右子樹掛接為*p的左子樹</p&g
46、t;<p> lc->rchild = p; p = lc; // p指向新的根結(jié)點(diǎn)</p><p> } // R_Rotate</p><p> void L_Rotate(BSTree &p) { // 算法 9.10</p><p> // 對以p↑為根的二叉排序樹作左旋處理,處理之后p指向新的樹根結(jié)點(diǎn),</
47、p><p> // 即旋轉(zhuǎn)處理之前的右子樹的根結(jié)點(diǎn)</p><p> BSTree rc;</p><p> rc = p->rchild; // rc指向*p的右子樹根結(jié)點(diǎn)</p><p> p->rchild = rc->lchild; // rc的左子樹掛接為*p的右子樹</p&g
48、t;<p> rc->lchild = p; p = rc; // p指向新的根結(jié)點(diǎn)</p><p> } // L_Rotate</p><p> void LeftBalance(BSTree &T) { // 算法 9.12</p><p> // 對以指針T所指結(jié)點(diǎn)為根的二叉樹作左平衡旋轉(zhuǎn)處理。</p>
49、<p> // 本算法結(jié)束時(shí),指針T指向新的根結(jié)點(diǎn)</p><p> BSTree lc,rd;</p><p> lc = T->lchild; // lc指向*T的左子樹根結(jié)點(diǎn)</p><p> switch (lc->bf) { // 檢查*T的左子樹的平衡度,并作相應(yīng)平衡處理</p><p>
50、 case LH: // 新結(jié)點(diǎn)插入在*T的左孩子的左子樹上,要作單右旋處理</p><p> T->bf = lc->bf = EH; </p><p> R_Rotate(T); </p><p><b> break; </b></p><p> case RH: // 新
51、結(jié)點(diǎn)插入在*T的左孩子的右子樹上,要作雙旋處理</p><p> rd = lc->rchild; // rd指向*T的左孩子的右子樹根</p><p> switch (rd->bf) { // 修改*T及其左孩子的平衡因子</p><p> case LH: T->bf = RH; lc->bf = EH; break;&
52、lt;/p><p> case EH: T->bf = lc->bf = EH; break;</p><p> case RH: T->bf = EH; lc->bf = LH; break;</p><p> } // switch (rd->bf)</p><p> rd->bf
53、= EH; </p><p> L_Rotate(T->lchild); // 對*T的左子樹作左旋平衡處理</p><p> R_Rotate(T); // 對*T作右旋平衡處理</p><p> } // switch (lc->bf) </p><p> } // Lef
54、tBalance</p><p> void RightBalance(BSTree &T) { // 算法 9.12</p><p> // 對以指針T所指結(jié)點(diǎn)為根的二叉樹作右平衡旋轉(zhuǎn)處理。</p><p> // 本算法結(jié)束時(shí),指針T指向新的根結(jié)點(diǎn)</p><p> BSTree rc,ld;</p>&l
55、t;p> rc = T->rchild; // rc指向*T的右子樹根結(jié)點(diǎn)</p><p> switch (rc->bf) { // 檢查*T的右子樹的平衡度,并作相應(yīng)平衡處理</p><p> case RH: // 新結(jié)點(diǎn)插入在*T的右孩子的右子樹上,要作單右旋處理</p><p> T->bf = rc->b
56、f = EH; </p><p> L_Rotate(T); </p><p><b> break; </b></p><p> case LH: // 新結(jié)點(diǎn)插入在*T的右孩子的左子樹上,要作雙旋處理</p><p> ld = rc->lchild; // ld指向*T的右孩子的左
57、子樹根</p><p> switch (ld->bf) { // 修改*T及其右孩子的平衡因子</p><p> case LH: T->bf = EH; rc->bf = RH; break;</p><p> case EH: T->bf = rc->bf = EH; break;</p>&
58、lt;p> case RH: T->bf = LH; rc->bf = EH; break;</p><p> } // switch (rd->bf)</p><p> ld->bf = EH; </p><p> R_Rotate(T->rchild); // 對*T的右子樹作右旋平衡處
59、理</p><p> L_Rotate(T); // 對*T作左旋平衡處理</p><p> } // switch (lc->bf) </p><p> } // LeftBalance</p><p> Status InsertAVL(BSTree &T, ElemType e, Status &
60、amp;taller) { // 算法9.11</p><p> // 若在平衡的二叉排序樹T中不存在和e有相同關(guān)鍵字的結(jié)點(diǎn),</p><p> // 則插入一個(gè)數(shù)據(jù)元素為e的新結(jié)點(diǎn),并返回1,否則返回0。</p><p> // 若因插入而使二叉排序樹失去平衡,則作平衡旋轉(zhuǎn)處理,</p><p> // 布爾變量taller反映T長
61、高與否</p><p> if (!T) { // 插入新結(jié)點(diǎn),樹"長高",置taller為TRUE</p><p> T = (BSTree) malloc (sizeof(BSTNode)); T->data = e;</p><p> T->lchild = T->rchild = NULL; T->bf
62、 = EH; taller = TRUE;</p><p><b> }</b></p><p><b> else {</b></p><p> if (e.key==T->data.key) // 樹中已存在和e有相同關(guān)鍵字的結(jié)點(diǎn)</p><p> { taller = F
63、ALSE; return 0; } // 則不再插入</p><p> if ((e.key<T->data.key)) { // 應(yīng)繼續(xù)在*T的左子樹中進(jìn)行搜索</p><p> if (InsertAVL(T->lchild, e, taller)==0) return 0; // 未插入</p><p> if (tall
64、er) // 已插入到*T的左子樹中且左子樹"長高"</p><p> switch (T->bf) { // 檢查*T的平衡度</p><p> case LH: // 原本左子樹比右子樹高,需要作左平衡處理</p><p> LeftBalance(T); taller = FALSE; break;</p&
65、gt;<p> case EH: // 原本左、右子樹等高,現(xiàn)因左子樹增高而使樹增高</p><p> T->bf = LH; taller = TRUE; break;</p><p> case RH: // 原本右子樹比左子樹高,現(xiàn)左、右子樹等高</p><p> T->bf = EH; taller = FAL
66、SE; break; </p><p> } // switch (T->bf)</p><p><b> } // if</b></p><p> else { // 應(yīng)繼續(xù)在T↑的右子樹中進(jìn)行搜索</p><p> if (InsertAVL(T->rchild, e, taller)
67、==0) return 0;</p><p> if (taller) // 已插入到*T的右子樹且右子樹長高</p><p> switch (T->bf) { // 檢查*T的平衡度</p><p> case LH: // 原本左子樹比右子樹高,現(xiàn)左、右子樹等高</p><p> T->bf =
68、 EH; taller = FALSE; break; </p><p> case EH: // 原本左、右子樹等高,現(xiàn)因右子樹增高而使樹增高</p><p> T->bf = RH; taller = TRUE; break;</p><p> case RH: // 原本右子樹比左子樹高,需要作右平衡處理</p>
69、<p> RightBalance(T); taller = FALSE; break;</p><p> } // switch (T->bf)</p><p><b> } // else</b></p><p> } // else </p><p><b> return
70、1;</b></p><p> } //InsertAVL</p><p> Status Delete(BSTree &p) { // 算法9.8</p><p> // 從二叉排序樹中刪除結(jié)點(diǎn)p,并重接它的左或右子樹</p><p> BSTree q, s;</p><p> if
71、 (!p->rchild) { // 右子樹空則只需重接它的左子樹</p><p> q = p; p = p->lchild; free(q);</p><p> } else if (!p->lchild) { // 只需重接它的右子樹</p><p> q = p; p = p->rchild; free(q);<
72、;/p><p> } else { // 左右子樹均不空</p><p> q = p; s = p->lchild;</p><p> while (s->rchild) // 轉(zhuǎn)左,然后向右到盡頭</p><p> { q = s; s = s->rchild; }</p><p>
73、 p->data = s->data; // s指向被刪結(jié)點(diǎn)的“后繼”</p><p> if (q != p) q->rchild = s->lchild; // 重接*q的右子樹</p><p> else q->lchild = s->lchild; // 重接*q的左子樹</p>
74、;<p> free(s); </p><p><b> }</b></p><p> return TRUE;</p><p> } // Delete</p><p> Status DeleteBST(BSTree &T, Status key) { // 算法9.7 <
75、;/p><p> // 若二叉排序樹T中存在關(guān)鍵字等于key的數(shù)據(jù)元素時(shí),</p><p> // 則刪除該數(shù)據(jù)元素結(jié)點(diǎn)p,并返回TRUE;否則返回FALSE</p><p> if (!T) return FALSE; // 不存在關(guān)鍵字等于key的數(shù)據(jù)元素</p><p><b> else {</b>
76、;</p><p> if (key==T->data.key) // 找到關(guān)鍵字等于key的數(shù)據(jù)元素</p><p> return Delete(T); </p><p> else if (key<T->data.key) return DeleteBST(T->lchild, key);</p><p>
77、; else return DeleteBST(T->rchild, key);</p><p><b> }</b></p><p> } // DeleteBST</p><p><b> 主函數(shù)代碼</b></p><p> #include"AVL.h"&
78、lt;/p><p> int main()</p><p><b> {</b></p><p> Status i,j,t,r=0,e,num;</p><p> ElemType avl;</p><p> //TElemType ;</p><p> Stat
79、us taller=0;</p><p> BSTree A=NULL,B=NULL,AVL=NULL;</p><p> cout<<" AVL樹的實(shí)現(xiàn) \n";</p><p> cout<<"*******************************\n&quo
80、t;;</p><p> cout<<"* 1、輸入數(shù)據(jù),建立AVL樹 *\n";</p><p> cout<<"* 2、輸入數(shù)據(jù),建立BST樹 *\n";</p><p> //cout<<"* 3、判斷二元樹是否為AVL樹 *\n";
81、</p><p> cout<<"* 0、退出系統(tǒng) *\n";</p><p> cout<<"*******************************\n";</p><p> cout<<"請輸入選擇:";</p>
82、;<p><b> cin>>i;</b></p><p> while (i!=0)</p><p><b> {</b></p><p><b> if (i==1)</b></p><p><b> {</b>&l
83、t;/p><p> cout<<" AVL樹的簡單操作 \n";</p><p> cout<<"******************************\n";</p><p> cout<<"* 1、建立AVL樹,先序遍歷 *\n&qu
84、ot;;</p><p> cout<<"* 2、刪除結(jié)點(diǎn) *\n";</p><p> cout<<"* 3、插入結(jié)點(diǎn) *\n";</p><p> cout<<"* 4、查找結(jié)點(diǎn) *
85、\n";</p><p> cout<<"* 0、退出本操作 *\n";</p><p> cout<<"******************************\n";</p><p> cout<<"請輸入選擇:";<
86、;/p><p><b> cin>>j;</b></p><p> while (j!=0)</p><p><b> {</b></p><p><b> if (j==1)</b></p><p><b> {</b
87、></p><p> cout<<"請你輸入AVL樹的節(jié)點(diǎn)數(shù)目:\n";</p><p><b> cin>>num;</b></p><p> cout<<"請輸入數(shù)據(jù):";</p><p> while (num!=0)<
88、/p><p><b> {</b></p><p> cin>>avl.key;</p><p> InsertAVL(A, avl, taller);</p><p><b> num--;</b></p><p><b> }</b>
89、;</p><p> cout<<"先序遍歷結(jié)果";</p><p> PreorderAVL(A);</p><p> cout<<"\n\n";</p><p><b> }</b></p><p> else if (
90、j==2)</p><p><b> {</b></p><p> cout<<"輸入想要?jiǎng)h除的數(shù)據(jù):";</p><p><b> cin>>t;</b></p><p> DeleteBST(A,t);</p><p>
91、 N_PreOrderAVL(A);</p><p> Key_PreOrderAVL(A);</p><p><b> num=0;</b></p><p><b> A=NULL;</b></p><p> while (num<n)</p><p>&l
92、t;b> {</b></p><p> avl.key = k_ey[num];</p><p> InsertAVL(A, avl, taller);</p><p><b> num++;</b></p><p><b> }</b></p><p
93、> //PreorderAVL(A);</p><p> cout<<"\n\n";</p><p><b> }</b></p><p> else if (j==3)</p><p><b> {</b></p><p>
94、 cout<<"輸入想要插入的數(shù)據(jù):";</p><p> cin>>avl.key;</p><p> InsertAVL(A, avl, taller);</p><p> PreorderAVL(A);</p><p> cout<<"\n\n";<
95、;/p><p><b> }</b></p><p> else if (j==4)</p><p><b> {</b></p><p> cout<<"輸入想要查找的數(shù)據(jù):";</p><p> cin>>avl.key;
96、</p><p> if(SearchBST(A, avl.key, NULL, AVL))</p><p> cout<<"查找成功,資料數(shù)據(jù)為"<<AVL->data.key<<endl;</p><p><b> else </b></p><p>
97、; cout<<"此樹中沒有"<<avl.key<<"元素"<<endl;</p><p> cout<<"\n\n";</p><p><b> }</b></p><p><b> else</b&
98、gt;</p><p><b> {</b></p><p> cout<<"操作失??!\n";</p><p><b> }</b></p><p> cout<<" AVL樹的簡單操作 \n";&l
99、t;/p><p> cout<<"******************************\n";</p><p> cout<<"* 1、建立AVL樹,先序遍歷 *\n";</p><p> cout<<"* 2、刪除結(jié)點(diǎn) *\n&q
100、uot;;</p><p> cout<<"* 3、插入結(jié)點(diǎn) *\n";</p><p> cout<<"* 4、查找結(jié)點(diǎn) *\n";</p><p> cout<<"* 0、退出本操作 *
101、\n";</p><p> cout<<"******************************\n";</p><p> cout<<"請繼續(xù)在子目錄中選擇:";</p><p><b> cin>>j;</b></p><p
102、><b> }</b></p><p><b> A=NULL;</b></p><p><b> }</b></p><p> else if (i==2)</p><p><b> {</b></p><p>
103、 cout<<" BST樹的簡單操作 \n";</p><p> cout<<"******************************\n";</p><p> cout<<"* 1、建立BST樹,先序遍歷 *\n";</p><
104、p> cout<<"* 2、判斷BST樹是否為AVL樹 *\n";</p><p> cout<<"* 3、將BST樹轉(zhuǎn)換為AVL樹 *\n";</p><p> cout<<"* 0、退出本操作 *\n";</p><p
105、> cout<<"******************************\n";</p><p> cout<<"請繼續(xù)在目錄中選擇:";</p><p><b> cin>>e;</b></p><p> while(e!=0)</p>
106、<p><b> {</b></p><p><b> if(e==1)</b></p><p><b> {</b></p><p> cout<<"請你輸入BST樹的節(jié)點(diǎn)數(shù)目:\n";</p><p><b>
107、 cin>>num;</b></p><p> cout<<"請輸入數(shù)據(jù):";</p><p> while (num!=0)</p><p><b> {</b></p><p> cin>>avl.key;</p><p
108、> InsertBST(B, avl);</p><p><b> num--;</b></p><p><b> }</b></p><p> cout<<"先序遍歷結(jié)果:\n";</p><p> PreorderAVL(B);</p>
109、<p> cout<<"\n\n";</p><p><b> }</b></p><p> else if(e==2)</p><p><b> {</b></p><p> if(Balance(B))</p><p&g
110、t; cout<<"此BST樹是AVL樹";</p><p><b> else</b></p><p> cout<<"此BST樹不是AVL樹";</p><p> cout<<"\n\n";</p><p><
111、;b> }</b></p><p> else if(e==3)</p><p><b> {</b></p><p> N_PreOrderAVL(B);</p><p> Key_PreOrderAVL(B);</p><p><b> num=0;&l
112、t;/b></p><p><b> B=NULL;</b></p><p> while (num<n)</p><p><b> {</b></p><p> avl.key = k_ey[num];</p><p> InsertAVL(B, av
113、l, taller);</p><p><b> num++;</b></p><p><b> }</b></p><p> //PreorderAVL(B);</p><p> cout<<"\n\n";</p><p><b
114、> }</b></p><p><b> else</b></p><p><b> {</b></p><p> cout<<"操作失??!\n";</p><p><b> }</b></p><
115、p> cout<<" BST樹的簡單操作 \n";</p><p> cout<<"******************************\n";</p><p> cout<<"* 1、建立BST樹,先序遍歷 *\n";</p>
116、<p> cout<<"* 2、判斷BST樹是否為AVL樹 *\n";</p><p> cout<<"* 3、將BST樹轉(zhuǎn)換為AVL樹 *\n";</p><p> cout<<"* 0、退出本操作 *\n";</p>
117、<p> cout<<"******************************\n";</p><p> cout<<"請繼續(xù)在目錄中選擇:";</p><p><b> cin>>e;</b></p><p><b> }</
118、b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> cout<<"操作失??!\n";</p><p><b&g
119、t; }</b></p><p> cout<<" AVL樹的實(shí)現(xiàn) \n";</p><p> cout<<"*******************************\n";</p><p> cout<<"* 1、
120、輸入數(shù)據(jù),建立AVL樹 *\n";</p><p> cout<<"* 2、輸入數(shù)據(jù),建立BST樹 *\n";</p><p> //cout<<"* 3、判斷二元樹是否為AVL樹 *\n";</p><p> cout<<"* 0、退出系
121、統(tǒng) *\n";</p><p> cout<<"*******************************\n";</p><p> cout<<"請繼續(xù)在主目錄中選擇:";</p><p><b> cin>>i;</b>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)實(shí)踐環(huán)節(jié)實(shí)驗(yàn)報(bào)告(課程設(shè)計(jì))
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告(赫夫曼編碼)
- 06年數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告
- 《數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)》航班查詢系統(tǒng)實(shí)驗(yàn)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告--樹的遍歷
- 赫夫曼樹的實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告
- 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告---有關(guān)查找的操作
- 數(shù)據(jù)結(jié)構(gòu)各種排序算法的課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)圖書管理系統(tǒng)實(shí)驗(yàn)報(bào)告
- 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告--多種排序方式的比較
- 數(shù)據(jù)結(jié)構(gòu)-鄰接表存儲及遍歷-課程設(shè)計(jì)-實(shí)驗(yàn)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)-無向圖的操作-課程設(shè)計(jì)-實(shí)驗(yàn)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)三哈夫曼樹實(shí)驗(yàn)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--最小生成樹
- 數(shù)據(jù)結(jié)構(gòu)-二叉樹的遍歷與其結(jié)點(diǎn)的計(jì)算-課程設(shè)計(jì)-實(shí)驗(yàn)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--樹的應(yīng)用
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)
- 國開(電大)數(shù)據(jù)結(jié)構(gòu)課程實(shí)驗(yàn)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告-二叉樹的實(shí)現(xiàn)與遍歷
評論
0/150
提交評論