




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、目 錄沈陽航空航天大學I學術誠信聲明I1 題目介紹和功能要求41.1 題目介紹41.2 功能要求42 課程設計原理42.1 課設題目粗略分析42.2 原理圖介紹52.2.1 功能模塊52.2.2int main()主函數(shù)模塊62.2.3Node *Create()創(chuàng)建二叉樹模塊72.2.4 Node *closest_common_ancestor(Node *r, int u, int v)計算公共結點模塊83 主要函數(shù)描述93.1 創(chuàng)建二叉樹函數(shù)93.2 計算最近共同祖先函數(shù)93.3畫出二叉樹函數(shù)94 調試與分析104.1 調試過程105 運行結果115.1初始界面115.2創(chuàng)建二叉樹界面
2、115.3顯示二叉樹大概構成界面125.4輸入兩個結點計算最近共同祖先界面12參考文獻14附 錄(關鍵部分程序清單)15 1 題目介紹和功能要求1.1 題目介紹1、 根據(jù)鍵盤輸入數(shù)據(jù)創(chuàng)建二叉樹(默認采用先序遍歷創(chuàng)建二叉樹),結點數(shù)不少于5個。2、 假設二叉樹采用二叉鏈的結構存儲,p和q為二叉樹中的兩個結點,編寫程序計算它們最近的共同祖先并輸出。1.2 功能要求1、 有提示語句可以選擇是否退出程序。2、 具有判別輸入結點是否為該樹結點的功能。3、 p、q兩個結點可選,輸出顯示出樹的大概構成情況。2 課程設計原理2.1 課設題目粗略分析根據(jù)課設題目要求,擬將程序設計成八個模塊。以下是八個模塊的大體
3、分析:1、 int main()主函數(shù)模塊2、 int menu()提示語句模塊3、 Node *Create()創(chuàng)建二叉樹模塊4、 void dds(Node *p, Node *r)創(chuàng)建父結點模塊5、 void Draw(Node *r)顯示二叉樹大概構成模塊6、 Node *find(Node *p, int u)查找結點模塊7、 Node *closest_common_ancestor(Node *r, int u, int v)計算公共結點模塊8、 void clear(Node *r)清空標記模塊2.2 原理圖介紹2.2.1 功能模塊L C A生成模板查找模板顯示模板計算模板圖2
4、.2.1 功能模塊 2.2.2int main()主函數(shù)模塊圖2.2.2 主函數(shù)模塊2.2.3Node *Create()創(chuàng)建二叉樹模塊圖2.2.3創(chuàng)建二叉樹模塊2.2.4 Node *closest_common_ancestor(Node *r, int u, int v)計算公共結點模塊圖2.24計算最近共同結點模塊3 主要函數(shù)描述3.1 創(chuàng)建二叉樹函數(shù)調用遞歸,采用先序遍歷創(chuàng)建二叉樹,同時創(chuàng)建每個結點的父結點。根結點的父結點為NULL,左孩子和右孩子的父結點為他們的雙親,以鏈式存儲結構存儲二叉樹。3.2 計算最近共同祖先函數(shù)給出任意兩個結點P和Q后,先從P開始向上遍歷父結點,并進行標記
5、,直至指針指向NULL。接著,從Q開始遍歷其父結點,當指針遇到標記時退出循環(huán)。輸出最近共同祖先,否則無共同結點。3.3畫出二叉樹函數(shù)用一個二維數(shù)組graph 表示圖型,第一維表示圖的橫坐標,第二維表示圖的縱坐標,然后通過cal_d()函數(shù)計算出整個二叉樹的高度,cal_d()函數(shù)是一個遞歸函數(shù),從根結點向下遍歷,獲取最大深度即為二叉樹高度,然后從二叉樹頂部向左右結點遞歸建圖,在二維數(shù)組中畫出主要形狀后,以打印字符形式把圖形輸出。4 調試與分析4.1 調試過程在調試程序是主要遇到以下幾類問題:1、基本語法錯誤解決方法:因為這屬于對于C語言基礎知識掌握的問題,所以查閱了相關書籍詢問了老師和同學,最
6、終改正。2、 如何創(chuàng)建二叉樹,并創(chuàng)建每個結點的父結點解決方法:調用遞歸,采用鏈式存儲結構先序遍歷創(chuàng)建二叉樹,空結點設為-1。根結點的父結點為NULL,左孩子和右孩子的父結點為他們的雙親。3、二叉樹表示模塊 解決方法:用一個二維數(shù)組表示二叉樹,然后計算出整個二叉樹的高度,從頂部向下遞歸建圖 。5 運行結果5.1初始界面5.2創(chuàng)建二叉樹界面采用先序遍歷創(chuàng)建二叉樹,空結點為-1,創(chuàng)建二叉樹:21749385.3顯示二叉樹大概構成界面5.4輸入兩個結點計算最近共同祖先界面選擇輸入4 和 7兩個結點,它們的最近共同祖先為4。輸入 1 和8兩個結點,它們的最近共同祖先為2。輸入 5 和 7兩個結點, 它們
7、沒有最近共同祖先。參考文獻1 高富平,張楚 . 電子商務法M. 北京:北京大學出版社,20022 Huang S C,Huang Y M,Shieh S MVibration and stability of a rotating shaft containing a transerse crackJ, J Sound and Vibration,1993,162(3):3874013嚴蔚敏,吳偉民. 數(shù)據(jù)結構(c 語言版)M.北京:清華大學教育出版社,20064戴艷等.零基礎學算法M.北京:機械工業(yè)出版社.2012附 錄(關鍵部分程序清單)#include <stdio.h>#i
8、nclude <stdlib.h>#include <string.h>#define maxv 1024typedef struct Node int value, mark; struct Node *lc, *rc, *pa; Node;int graphmaxvmaxv;Node *Create();void dfs(Node *p, Node *r); /*設置父結點Node *find(Node *p, int u); /*查找void clear(Node *p); /*清空標記Node *closest_common_ancestor(Node *r,
9、int u, int v);/*計算最近共同祖先int menu();Node *Build(); /*構建二叉樹void Calculate(Node *r);int Max(int a, int b); /*比較a和b誰大int cal_d(Node *r, int d); /*計算二叉樹的高度void DFS(Node *r, int h, int w, int d); /*遞歸建圖void Draw(Node *r); /*畫出二叉樹int main() Node *r; while(1) switch(menu() case 1: r = Build(); break; case 2
10、: Calculate(r); break; case 3: Draw(r); break; case 0: return 0; return 0;Node *Create() int n; Node *p; scanf("%d", &n); if(n=-1) return NULL; p = (Node *)malloc(sizeof(Node); p->value = n; p->lc = Create(); p->rc = Create(); return p;void dfs(Node *p, Node *r) p->pa = r;
11、if(p->lc) dfs(p->lc, p); if(p->rc) dfs(p->rc, p);Node *find(Node *p, int u) Node *t; if(p->value=u) return p; if(p->lc) t = find(p->lc, u); if(t) return t; if(p->rc) t = find(p->rc, u); if(t) return t; return 0;Node *closest_common_ancestor(Node *r, int u, int v) Node *p =
12、 find(r, u); Node *q = find(r, v); while(p) p->mark = 1; p = p->pa; while(q) if(q->mark) break; q = q->pa; return q;void clear(Node *r) r->mark = 0; if(r->lc) clear(r->lc); if(r->rc) clear(r->rc);int menu() int option; printf("n-n"); printf("1、創(chuàng)建二叉樹n");
13、 printf("2、計算最近公共祖先n"); printf("3、顯示二叉樹n"); printf("0、退出n"); printf("-n"); scanf("%d", &option); return option;Node *Build() Node *p; printf("前序遍歷創(chuàng)建一棵二叉樹:n"); p = Create(); dfs(p, 0); return p;void Calculate(Node *r) int u, v; Node *p;
14、printf("輸入兩點:n"); scanf("%d%d", &u, &v); clear(r); p = closest_common_ancestor(r, u, v); if(!p) printf("沒有公共祖先n"); else printf("%d和%d的最近公共祖先是:%dn", u, v, p->value);int Max(int a, int b) return a>b ? a : b;int cal_d(Node *r, int d) int t = d; if(r
15、->lc) t = Max(t, cal_d(r->lc, d+1); if(r->rc) t = Max(t, cal_d(r->rc, d+1); return t;void DFS(Node *r, int h, int w, int d) int i; if(!r->lc && !r->rc) graphhw = r->value + '0' return ; graphhw = r->value + '0' if(r->lc) for(i=1; i<=(1<<d-2
16、); i+) graphhw-i = '-' graphh-1w-(1<<d-2) = '|' DFS(r->lc, h-2, w-(1<<d-2), d-1); if(r->rc) for(i=1; i<=(1<<d-2); i+) graphhw+i = '-' graphh-1w+(1<<d-2) = '|' DFS(r->rc, h-2, w+(1<<d-2), d-1); void Draw(Node *r)/*畫出二叉樹 int d,
17、h, w, i, j; if(!r) return ; d = cal_d(r, 1); h = d*2; w = 1<<d-1; DFS(r, h, w, d); for(i=h; i>=0; i-) for(j=0; j<w*2; j+) if(!graphij) putchar(' '); else putchar(graphij); putchar('n'); 課程設計總結:這次課程設計讓我收獲很多。這次的課設題目是求二叉樹中任意兩點的最近共同祖先,即經(jīng)典的LCA(Lowest Common Ancestor)題型。求解此問題的算法有很多,我在做這次的課設中采用的主要思路是:令每條樹上左孩子和右孩子的父親為父結點,根結點的父結點為NULL,在存儲二叉樹的同時存儲每個結點的父結點。給出任意兩個結點P和Q后,先從P開始向上遍歷父結點,并進行標記,直至NULL。接著,從Q開始遍歷其父結點,當指針遇到標記時退出循環(huán)。輸出最近共同祖先,否則無共同結點。通過這次課設,讓自己學到很多,首先是在面對自己從未見過的問題時,應該從已知的知識入手,首先是二叉樹的先序存儲,其次
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 在校學生實習表現(xiàn)證明及成果匯報(6篇)
- 棉被購銷協(xié)議年
- 我和書的友誼寫人作文9篇
- 讀少年中國說后的啟示議論文9篇
- 2025年茶藝師初級職業(yè)資格考試試卷
- 2025年安全工程師考試模擬試卷:安全生產(chǎn)標準化評審案例分析
- 2025年會計職稱考試《初級會計實務》復盤強化錯題精講試題
- 2025年摩托車維修工(中級)考試試卷:摩托車維修行業(yè)政策解讀與行業(yè)發(fā)展趨勢分析
- 在成長的路上話題作文(7篇)
- 2025年場(廠)內專用機動車輛作業(yè)特種操作證考試實戰(zhàn)技巧試題試卷
- 《光伏發(fā)電工程工程量清單計價規(guī)范》
- 關于讀后續(xù)寫的可行操作課件-高三英語一輪復習
- 港口企業(yè)財務風險分析報告
- 2023年貴州黔西南州專項招聘國企業(yè)工作人員21人考前自測高頻難、易考點模擬試題(共500題)含答案詳解
- 中醫(yī)護理實訓報告總結
- 動畫制作與電影特效課件
- 監(jiān)理抽檢表 - 08橋梁工程
- 鼻息肉護理教學查房
- 小區(qū)交通安全應急預案
- 2023年第四屆全國郵政行業(yè)職業(yè)技能競賽-全國總決賽理論知識試題及答案
- 店鋪租房承諾書范本
評論
0/150
提交評論