版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p> 課 程 設(shè) 計 報 告</p><p><b> ——數(shù)據(jù)結(jié)構(gòu)</b></p><p><b> 題目:二叉排序樹</b></p><p> 姓 名: </p><p><b> 學 號:</b></p&
2、gt;<p><b> 專 業(yè):</b></p><p> 班 級: </p><p><b> 指導老師: </b></p><p><b> 年 月 日</b></p><p><b> 目 錄</b>&
3、lt;/p><p> 一、課程設(shè)計簡介3</p><p> 二、原理分析及流程3</p><p> 2.1、原理分析............................................................................3</p><p> 2.2、流程圖................
4、................................................................4</p><p> 1、main()函數(shù)....................................................................4</p><p> 2、創(chuàng)建..........................
5、.....................................................4</p><p> 3、插入...............................................................................5</p><p> 4、查找................................
6、...............................................6</p><p> 5、中序遍歷輸出7</p><p><b> 三、算法描述8</b></p><p> 3.1、存儲結(jié)構(gòu)8</p><p> 3.2、插入算法8</p><p>
7、3.3、查找算法9</p><p> 3.4、刪除算法10</p><p> 四、小結(jié)與體會12</p><p> 五、程序執(zhí)行過程13</p><p> 5.1、創(chuàng)建二叉排序樹并中序輸出.........................................13 5.2、插入并中序輸出..............
8、................................................13</p><p> 5.3、查找..................................................................................14</p><p><b> 六、程序清單14</b></p
9、><p><b> 一、課程設(shè)計簡介</b></p><p> 1.1、題目:二叉排序樹相關(guān)操作</p><p> 1、創(chuàng)建二叉排序樹;2、插入給定值;</p><p> 3、查找給定值; 4、刪除給定值的結(jié)點。</p><p><b> 1.2、報告要求:</b>
10、;</p><p> 1、封面; 2、題目與流程圖或模塊圖;</p><p> 3、程序清單和運行結(jié)果; 4、小結(jié)(收獲和體會);</p><p><b> 5、裝訂成冊。</b></p><p><b> 1.3、目的:</b></p><
11、;p> 課程設(shè)計為學生提供了一個既動手又動腦,獨立實踐的機會,將課本上的理論知識和實際有機的結(jié)合起來,鍛煉學生的分析解決實際問題的能力。提高學生適應(yīng)實際,實踐編程的能力。</p><p><b> 二、原理分析及流程</b></p><p><b> 2.1、原理分析:</b></p><p> 根據(jù)題目要求
12、,要實現(xiàn)這些功能,就必須創(chuàng)建一個菜單。這個菜單設(shè)置在main()函數(shù)里面,然后使用while()...switch()語句進行循環(huán)調(diào)用相關(guān)函數(shù),以達到實現(xiàn)相關(guān)功能的目的。</p><p><b> 2.2、流程圖:</b></p><p> 1、main()函數(shù):</p><p><b> 2、創(chuàng)建:</b><
13、/p><p><b> 3、插入:</b></p><p><b> N</b></p><p><b> Y</b></p><p><b> N</b></p><p><b> Y</b></
14、p><p><b> 4、查找:</b></p><p><b> Y</b></p><p><b> N</b></p><p><b> YN</b></p><p><b> 5、中序遍歷輸出:</b
15、></p><p><b> 三、算法描述</b></p><p><b> 3.1、存儲結(jié)構(gòu)</b></p><p> 定義一個鏈表式的二叉排序樹,用鏈表的方式構(gòu)造結(jié)點,存儲二叉排序樹中的結(jié)點、結(jié)點類型和指針類型如下:</p><p> #include <stdio.h>
16、;</p><p> #define null 0</p><p> typedef int keytype;</p><p> typedef struct node</p><p><b> {</b></p><p> keytype key;</p><p&g
17、t; struct node *lchild,*rchild;</p><p> }bstnode,*bstree;</p><p><b> 3.2、插入算法</b></p><p> 在二叉排序樹中插入一個新節(jié)點,首先要查找該節(jié)點在二叉排序樹中是否已經(jīng)存在。若二叉排序樹中不存在關(guān)鍵字等于x的節(jié)點,則插入。</p>&l
18、t;p> 將一個關(guān)鍵字值為x的節(jié)點s插入到二叉排序樹中,可以用下面的方法:</p><p> (1)若二叉排序樹為空,則關(guān)鍵字為x的節(jié)點s成為二叉排序樹的根</p><p> (2)若二叉排序樹非空,則將x與二叉排序樹根進行比較,如果x的值等于根節(jié)點關(guān)鍵值,則停止插入;如果x的根節(jié)點值小于根節(jié)點關(guān)鍵值,則將x插入左子樹;如果x的值大于根節(jié)點關(guān)鍵字的值,則將x插入右子樹。在左右兩
19、個子樹的插入方法與整個二叉排序樹相同。</p><p><b> 算法如下:</b></p><p> void insert(bstree *t,keytype x)</p><p><b> {</b></p><p><b> bstree s;</b></
20、p><p> if(*t==null)</p><p><b> {</b></p><p> s=(bstree)malloc(sizeof(bstnode));</p><p><b> s->key=x;</b></p><p> s->lchild=
21、null;</p><p> s->rchild=null;</p><p><b> *t=s;</b></p><p><b> }</b></p><p> else if(x<(*t)->key)</p><p> insert(&
22、((*t)->lchild),x);</p><p> else if(x>(*t)->key)</p><p> insert(&((*t)->rchild),x);</p><p><b> } </b></p><p><b> 3.3、查找算法</b>
23、</p><p> ?。?)若二叉排序樹不為空,將根結(jié)點的關(guān)鍵字與待查關(guān)鍵字進行比較,若相等,則查找成功;若根節(jié)點關(guān)鍵字大于待查值,則進入左子樹重復次步驟,否則,進入右子樹進行此步驟;若在查找過程中遇到二叉排序樹的葉子節(jié)點時,還沒有找到待查節(jié)點,則查找不成功。</p><p> ?。?)否則,查找失敗,返回null。</p><p><b> 算法如下:
24、</b></p><p> bstree search(bstree t,keytype x)</p><p><b> {</b></p><p><b> bstree p;</b></p><p><b> p=t;</b></p>&l
25、t;p> if(p!=null)</p><p><b> {</b></p><p> if (x==p->key) return p->key;</p><p> else if(x<p->key) return search(p->lchild,x);</p><p>
26、 else return search(p->rchild,x);</p><p><b> }</b></p><p><b> else</b></p><p> { printf("%d can not be found\n",x);return null;</p>&l
27、t;p><b> }</b></p><p><b> }</b></p><p><b> 3.4、刪除算法</b></p><p> 在二叉排序樹中刪除節(jié)點,首先要確定被刪除的節(jié)點是否在二叉排序樹中。</p><p> 若不在,則不做任何操作;否則,假設(shè)要刪
28、除的節(jié)點為p,節(jié)點p的父節(jié)點為r,并假設(shè)p是r的左孩子。根據(jù)被刪除節(jié)點p有無孩子,刪除部分可做以下3中情況討論:</p><p> ?。?)若p為葉子節(jié)點,則可令其父節(jié)點r的左孩子指針域為空,直接將其刪除。</p><p> (2)若p節(jié)點只有右子樹或左子樹,則可以將p的左子樹或右子樹直接改為其雙親節(jié)點r的左子樹。</p><p> ?。?)若p既有左子樹又有右子
29、樹;將節(jié)點s為p的中序前驅(qū)。首先找到p的中序前驅(qū)節(jié)點s,然后用節(jié)點s的值代替節(jié)點p的值,再將節(jié)點s刪除,節(jié)點s的原左子樹改為s的雙親節(jié)點q的右子樹。</p><p><b> 算法如下:</b></p><p> bstree delete(bstree t,keytype x)</p><p><b> {</b>
30、</p><p> bstree p,q,r,s;</p><p><b> p=t;</b></p><p><b> r=null;</b></p><p><b> while(p)</b></p><p><b> {<
31、/b></p><p> if(x==p->key) break;</p><p><b> r=p;</b></p><p> if(x<p->key) p=p->lchild;</p><p> else p=p->rchild;</p>
32、;<p><b> }</b></p><p> if(p==null) {printf("%d is not exist!\n",x);return t;}</p><p> if((p->lchild==null)||(p->rchild==null))</p><p><b&g
33、t; {</b></p><p> if(r==null)</p><p> if(p->lchild==null)</p><p> t=p->rchild;</p><p> else t=p->lchild;</p><p> else if(p->lchild=
34、=null)</p><p> if(r->lchild==p)</p><p> r->lchild=p->rchild;</p><p> else r->rchild=p->rchild;</p><p> else if(r->lchild==p)</p><p>
35、 r->lchild=p->lchild;</p><p> else r->lchild=p->lchild;</p><p><b> free(p);</b></p><p><b> }</b></p><p><b> else</b>
36、</p><p><b> {</b></p><p><b> q=p;</b></p><p> s->lchild;</p><p> while(s->rchild)</p><p> {q=s;s->rchild;}</p>
37、<p> if(q==p) q->lchild=s->lchild;</p><p> else p->key=s->key;</p><p><b> free(s);</b></p><p><b> }</b></p><p><b
38、> return t;</b></p><p><b> }</b></p><p><b> 四、小結(jié)與體會</b></p><p> 經(jīng)過一個多星期來夜以繼日的努力,終于把課程設(shè)計——二叉排序樹的相關(guān)算法全部完成!在編寫程序過程中,讓我對二叉排序樹的創(chuàng)建、插入、查找、刪除算法有了較系統(tǒng)的認識,
39、也發(fā)現(xiàn)了一些以前紙上談兵時的思想誤區(qū)。比如實現(xiàn)插入功能時,從根節(jié)點開始比較;當實現(xiàn)刪除功能時,如果待刪除結(jié)點p左、右子樹齊全,首先找到p的中序前驅(qū)節(jié)點s(p的中序前驅(qū)),然后用節(jié)點s的值代替節(jié)點p的值,再將節(jié)點s刪除,節(jié)點s的原左子樹改為s的雙親節(jié)點q的右子樹。實現(xiàn)中序遍歷功能時,采用遞歸思想......</p><p> 這是第一次關(guān)于編寫程序的課程設(shè)計。雖然上機安排只有兩天時間,可卻并不像平時上機實驗一樣,
40、離開了機房就不用再對著電腦屏幕編寫代碼,更多的工作實在離開機房后完成的。一遍一遍地按F9調(diào)試程序,error從幾十個減少到幾個,再到只剩幾個warring,當按下Ctrl+F9,那精心設(shè)計的“菜單”出現(xiàn)在屏幕上時,那一刻的心情無以言表!涌上心頭的除了自豪感、成就感之外,還有對編程工作之辛苦的慨嘆!因為自己專業(yè)將來的方向與這有關(guān),不免讓我考慮起畢業(yè)后的發(fā)展方向。如果朝這方面發(fā)展的話,我是否可以勝任這樣的工作?如果不是,又該選擇什么?<
41、;/p><p><b> 程序執(zhí)行過程</b></p><p> 5.1、創(chuàng)建二叉排序樹并中序輸出</p><p> 5.2插入并中序輸出</p><p><b> 5.3、查找</b></p><p> 5.4、刪除并中序輸出</p><p>
42、<b> 六、程序清單</b></p><p> #include <stdio.h></p><p> #define null 0</p><p> typedef int keytype;</p><p> typedef struct node</p><p><
43、;b> {</b></p><p> keytype key;</p><p> struct node *lchild,*rchild;</p><p> }bstnode,*bstree;</p><p> void insert(bstree *t,keytype x);</p><p&g
44、t; bstree search(bstree t,keytype x);</p><p> void display(bstree t);</p><p> void create(bstree *t)</p><p><b> {</b></p><p> keytype x;</p><
45、;p><b> *t=null;</b></p><p> scanf("%d",&x);</p><p> while(x!=-1)</p><p><b> {</b></p><p> insert(t,x);</p><p>
46、; scanf("%d",&x);</p><p><b> }</b></p><p><b> }</b></p><p> void insert(bstree *t,keytype x)</p><p><b> {</b><
47、/p><p><b> bstree s;</b></p><p> if(*t==null)</p><p><b> {</b></p><p> s=(bstree)malloc(sizeof(bstnode));</p><p><b> s->
48、key=x;</b></p><p> s->lchild=null;</p><p> s->rchild=null;</p><p><b> *t=s;</b></p><p><b> }</b></p><p> else if(x
49、<(*t)->key)</p><p> insert(&((*t)->lchild),x);</p><p> else if(x>(*t)->key)</p><p> insert(&((*t)->rchild),x);</p><p><b> }</b>
50、;</p><p> bstree search(bstree t,keytype x)</p><p><b> {</b></p><p><b> bstree p;</b></p><p><b> p=t;</b></p><p>
51、if(p!=null)</p><p><b> {</b></p><p> if (x==p->key) return p->key;</p><p> else if(x<p->key) return search(p->lchild,x);</p><p> else ret
52、urn search(p->rchild,x);</p><p><b> }</b></p><p><b> else</b></p><p> { printf("%d can not be found\n",x);</p><p> return null;
53、</p><p><b> }</b></p><p><b> }</b></p><p> bstree delete(bstree t,keytype x)</p><p><b> {</b></p><p> bstree p,q,r
54、,s;</p><p><b> p=t;</b></p><p><b> r=null;</b></p><p><b> while(p)</b></p><p><b> {</b></p><p> if(x==
55、p->key) break;</p><p><b> r=p;</b></p><p> if(x<p->key) p=p->lchild;</p><p> else p=p->rchild;</p><p><b> }</b>&
56、lt;/p><p> if(p==null) {printf("%d is not exist!\n",x);return t;}</p><p> if((p->lchild==null)||(p->rchild==null))</p><p><b> {</b></p><p>
57、; if(r==null)</p><p> if(p->lchild==null)</p><p> t=p->rchild;</p><p><b> else</b></p><p> t=p->lchild;</p><p> else if(p->lc
58、hild==null)</p><p> if(r->lchild==p)</p><p> r->lchild=p->rchild;</p><p><b> else</b></p><p> r->rchild=p->rchild;</p><p>
59、else if(r->lchild==p)</p><p> r->lchild=p->lchild;</p><p><b> else</b></p><p> r->lchild=p->lchild;</p><p><b> free(p);</b>&l
60、t;/p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> q=p;</b></p><p> s->lchild;</p&g
61、t;<p> while(s->rchild)</p><p> {q=s;s->rchild;}</p><p><b> if(q==p)</b></p><p> q->lchild=s->lchild;</p><p><b> else</b>
62、;</p><p> p->key=s->key;</p><p><b> free(s);</b></p><p><b> }</b></p><p><b> return t;</b></p><p><b>
63、}</b></p><p> void display(bstree t)</p><p><b> {</b></p><p> if(t!=null)</p><p><b> {</b></p><p> display(t->lchild)
64、;</p><p> printf("%5d",t->key);</p><p> display(t->rchild);</p><p><b> }</b></p><p><b> }</b></p><p> void mai
65、n(void)</p><p><b> {</b></p><p> bstree t,b;</p><p> int i=1,j;</p><p> keytype x;</p><p><b> while(i)</b></p><p>
66、;<b> {</b></p><p> printf("\n* * * * * * * * * * * * * * * *\n");</p><p> printf("\n* MENU OF BSTREE *\n");</p><p> printf("\n*
67、 1.create 2.insert *\n");</p><p> printf("\n* 3.search 4.delete *\n");</p><p> printf("\n* 5.exit *\n");</p><p>
68、 printf("\n* * * * * * * * * * * * * * * *\n");</p><p> printf(" what do you want to do? :");scanf("%d",&j);</p><p><b> switch(j)</b></p>&
69、lt;p><b> {</b></p><p> case 1: printf("input bstree's values,end with -1:\n");create(&t);</p><p> printf("bstree's root is %d\n",t->key);di
70、splay(t);break;</p><p> case 2: printf("input the insert value:");scanf("%d",&x);</p><p> insert(&t,x);display(t);break;</p><p> case 3: printf(&q
71、uot;input the search value:");scanf("%d",&x);</p><p> printf("result is: %d",search(t,x));break;</p><p> case 4: printf("input the delete value:");scan
72、f("%d",&x);</p><p> delete(t,x);display(t);break;</p><p> case 5: i=0;break;</p><p><b> }</b></p><p><b> }</b></p>&l
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--二叉排序樹
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--二叉排序樹的實現(xiàn)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-二叉排序樹的實現(xiàn)
- 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計--二叉排序樹調(diào)整為平衡二叉樹
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(二叉排序樹的相關(guān)操作)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告---二叉排序樹實現(xiàn)集合的運算
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---二叉排序樹和平衡二叉樹的判別
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-二叉排序樹的簡單應(yīng)用報告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---判別給定的二叉樹是否為二叉排序樹
- 《二叉排序樹的操作》課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)二叉排序樹的實現(xiàn)__(用順序和二叉鏈表作存儲結(jié)構(gòu)_)課程設(shè)計
- 課程設(shè)計--- 二叉排序樹的實現(xiàn)
- 二叉樹數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 二叉排序樹實驗
- 二叉排序樹實驗
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告---線索二叉樹
- 《數(shù)據(jù)結(jié)構(gòu)遍歷二叉樹》課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告--二叉樹的算法
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計----二叉樹的應(yīng)用
- 二叉平衡樹的實現(xiàn)---數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
評論
0/150
提交評論