




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
數(shù)據(jù)結(jié)構(gòu)教材
李春葆數(shù)據(jù)結(jié)構(gòu)教程清華大學(xué)出版社嚴(yán)蔚敏數(shù)據(jù)結(jié)構(gòu)清華大學(xué)出版社參考書(shū)
李春葆數(shù)據(jù)結(jié)構(gòu)習(xí)題與解析(第2版或第3版)清華大學(xué)出版社第1頁(yè)概述模塊1:線性表模塊2:樹(shù)型結(jié)構(gòu)模塊3:圖型結(jié)構(gòu)模塊4:其它第2頁(yè)1.數(shù)據(jù)結(jié)構(gòu)定義
數(shù)據(jù)→數(shù)據(jù)元素→數(shù)據(jù)項(xiàng)數(shù)據(jù)結(jié)構(gòu)是指數(shù)據(jù)以及相互之間聯(lián)絡(luò)(或關(guān)系)。包含:(1)數(shù)據(jù)邏輯結(jié)構(gòu)。(2)數(shù)據(jù)存放結(jié)構(gòu)(物理結(jié)構(gòu))。(3)施加在該數(shù)據(jù)上運(yùn)算。
概述第3頁(yè)
數(shù)據(jù)邏輯結(jié)構(gòu)是從邏輯關(guān)系上描述數(shù)據(jù),它與數(shù)據(jù)存放無(wú)關(guān),是獨(dú)立于計(jì)算機(jī)。數(shù)據(jù)存放結(jié)構(gòu)是邏輯結(jié)構(gòu)用計(jì)算機(jī)語(yǔ)言實(shí)現(xiàn)(亦稱為映象),它是依賴于計(jì)算機(jī)語(yǔ)言。數(shù)據(jù)運(yùn)算是定義在數(shù)據(jù)邏輯結(jié)構(gòu)上,每種邏輯結(jié)構(gòu)都有一組對(duì)應(yīng)運(yùn)算。但運(yùn)算實(shí)現(xiàn)與數(shù)據(jù)存放結(jié)構(gòu)相關(guān)。程序=數(shù)據(jù)結(jié)構(gòu)+算法概述第4頁(yè)(1)線性結(jié)構(gòu)(2)樹(shù)形結(jié)構(gòu)(3)圖形結(jié)構(gòu)概述邏輯結(jié)構(gòu)主要有三大類(lèi):第5頁(yè)存放結(jié)構(gòu)分為以下四種:(1)次序存放方法(2)鏈?zhǔn)酱娣欧椒ǎ?)索引存放方法(4)散列存放方法
概述第6頁(yè)2.算法
算法是對(duì)特定問(wèn)題求解步驟一個(gè)描述,它是指令有限序列。概述第7頁(yè)算法五個(gè)主要特征:(1)有窮性(2)確定性(3)可行性(4)有輸入(5)有輸出
概述第8頁(yè)
算法時(shí)間復(fù)雜度:是指其基本運(yùn)算在算法中重復(fù)執(zhí)行次數(shù)。
算法中基本運(yùn)算次數(shù)T(n)是問(wèn)題規(guī)模n某個(gè)函數(shù)f(n),記作:T(n)=O(f(n))記號(hào)“O”讀作“大O”,它表示隨問(wèn)題規(guī)模n增大算法執(zhí)行時(shí)間增加率和f(n)增加率相同。
概述第9頁(yè)例分析以下程序段時(shí)間復(fù)雜度。i=1;while(i<=n)i=i*2;解:上述算法中基本操作是語(yǔ)句i=i*2,設(shè)其頻度為T(mén)(n),則有:2T(n)≤n即T(n)≤log2n=O(log2n)。所以,該程序段時(shí)間復(fù)雜度為O(log2n)。第10頁(yè)
算法空間復(fù)雜度:是對(duì)一個(gè)算法在運(yùn)行過(guò)程中暫時(shí)占用存放空間大小量度。
對(duì)于空間復(fù)雜度為O(1)算法稱為原地工作或就地工作算法。
概述第11頁(yè)■遞歸定義3.算法設(shè)計(jì)方法:遞歸在定義一個(gè)算法時(shí)出現(xiàn)調(diào)用本算法成份,稱之為遞歸。概述第12頁(yè)■遞歸模型由遞歸出口和遞歸體組成比如,求二叉樹(shù)全部結(jié)點(diǎn)個(gè)數(shù):f(b)=0 b=NULLf(b)=f(b->lchild)+f(b->rchild)+1b≠NULL概述第13頁(yè)■遞歸算法設(shè)計(jì)①對(duì)原問(wèn)題f(s)進(jìn)行分析,假設(shè)出合理“較小問(wèn)題”f(s');②假設(shè)f(s')是可解,在此基礎(chǔ)上確定f(s)解,即給出f(s)與f(s')之間關(guān)系;③確定一個(gè)特定情況(如f(1)或f(0))解,由此作為遞歸出口.概述第14頁(yè)bb->rchildb->lchild①假設(shè)出合理“較小問(wèn)題”:假設(shè)左右子樹(shù)結(jié)點(diǎn)個(gè)數(shù)可求②求出f(s)與f(s‘)之間關(guān)系:f(b)=f(b->lchild)+f(b->rchild)+1③確定遞歸出口:f(NULL)=0概述第15頁(yè)intf(BTNode*b){if(b==NULL)return(0);elsereturn(f(b->lchild)+f(b->rchild)+1);}求解算法:概述第16頁(yè)例設(shè)計(jì)求f(n)=1+2+...+n遞歸算法解:f(n)為前n項(xiàng)之和,則f(n-1)=1+2+...+(n-1)假設(shè)f(n-1)可求,則f(n)=f(n-1)+n,所以:f(n)=1 當(dāng)n=1f(n)=f(n-1)+n當(dāng)n>1對(duì)應(yīng)遞歸算法以下:第17頁(yè)intf(intn){if(n==1)return(1);elsereturn(f(n-1)+n));}第18頁(yè)1.普通線性表線性表:含有相同特征數(shù)據(jù)元素一個(gè)有限序列。不是集合。模塊1:線性結(jié)構(gòu)邏輯結(jié)構(gòu)第19頁(yè)(1)次序表
typedefstruct{ ElemTypeelem[MaxSize]; /*存放次序表元素*/ intlength; /*存放次序表長(zhǎng)度*/}SqList;存放結(jié)構(gòu)之一模塊1:線性結(jié)構(gòu)第20頁(yè)次序表基本運(yùn)算實(shí)現(xiàn)
插入數(shù)據(jù)元素算法:元素移動(dòng)次數(shù)不但與表長(zhǎng)n相關(guān);插入一個(gè)元素時(shí)所需移動(dòng)元素平均次數(shù)n/2。平均時(shí)間復(fù)雜度為O(n)。
模塊1:線性結(jié)構(gòu)第21頁(yè)
刪除數(shù)據(jù)元素算法:元素移動(dòng)次數(shù)也與表長(zhǎng)n相關(guān)。刪除一個(gè)元素時(shí)所需移動(dòng)元素平均次數(shù)為(n-1)/2。刪除算法平均時(shí)間復(fù)雜度為O(n)。模塊1:線性結(jié)構(gòu)第22頁(yè)(2)鏈表
定義單鏈表結(jié)點(diǎn)類(lèi)型:typedefstructLNode{ElemTypedata;structLNode*next; /*指向后繼結(jié)點(diǎn)*/}LinkList;存放結(jié)構(gòu)之二模塊1:線性結(jié)構(gòu)第23頁(yè)定義雙鏈表結(jié)點(diǎn)類(lèi)型:typedefstructDNode {ElemTypedata;structDNode*prior; /*指向前驅(qū)結(jié)點(diǎn)*/structDNode*next; /*指向后繼結(jié)點(diǎn)*/}DLinkList;模塊1:線性結(jié)構(gòu)第24頁(yè)
■單鏈表基本運(yùn)算實(shí)現(xiàn)
重點(diǎn):(1)頭插法建表和尾插法建表算法,它是很多算法設(shè)計(jì)基礎(chǔ);(2)查找、插入和刪除操作。模塊1:線性結(jié)構(gòu)第25頁(yè)
頭插法建表該方法從一個(gè)空表開(kāi)始,讀取字符數(shù)組a中字符,生成新結(jié)點(diǎn),將讀取數(shù)據(jù)存放到新結(jié)點(diǎn)數(shù)據(jù)域中,然后將新結(jié)點(diǎn)插入到當(dāng)前鏈表表頭上,直到結(jié)束為止。采取頭插法建表算法以下:模塊1:線性結(jié)構(gòu)第26頁(yè)voidCreateListF(LinkList*&L,ElemTypea[],intn){LinkList*s;inti;L=(LinkList*)malloc(sizeof(LinkList));/*創(chuàng)建頭結(jié)點(diǎn)*/L->next=NULL;for(i=0;i<n;i++){s=(LinkList*)malloc(sizeof(LinkList));/*創(chuàng)建新結(jié)點(diǎn)*/s->data=a[i];s->next=L->next; /*將*s插在原開(kāi)始結(jié)點(diǎn)之前,頭結(jié)點(diǎn)之后*/L->next=s;}}模塊1:線性結(jié)構(gòu)第27頁(yè)adcbi=0i=1i=2i=3∧head采取頭插法建立單鏈表過(guò)程heada∧headda∧headcda∧headbcda∧第1步:建頭結(jié)點(diǎn)第2步:i=0,新建a結(jié)點(diǎn),插入到頭結(jié)點(diǎn)之后第3步:i=1,新建d結(jié)點(diǎn),插入到頭結(jié)點(diǎn)之后第4步:i=2,新建c結(jié)點(diǎn),插入到頭結(jié)點(diǎn)之后第5步:i=3,新建b結(jié)點(diǎn),插入到頭結(jié)點(diǎn)之后第28頁(yè)
尾插法建表
頭插法建立鏈表即使算法簡(jiǎn)單,但生成鏈表中結(jié)點(diǎn)次序和原數(shù)組元素次序相反。若希望二者次序一致,可采取尾插法建立。該方法是將新結(jié)點(diǎn)插到當(dāng)前鏈表表尾上,為此必須增加一個(gè)尾指針r,使其一直指向當(dāng)前鏈表尾結(jié)點(diǎn)。采取尾插法建表算法以下:模塊1:線性結(jié)構(gòu)第29頁(yè)voidCreateListR(LinkList*&L,ElemTypea[],intn){LinkList*s,*r;inti;L=(LinkList*)malloc(sizeof(LinkList)); /*創(chuàng)建頭結(jié)點(diǎn)*/L->next=NULL;r=L;/*r一直指向終端結(jié)點(diǎn),開(kāi)始時(shí)指向頭結(jié)點(diǎn)*/for(i=0;i<n;i++){s=(LinkList*)malloc(sizeof(LinkList));/*創(chuàng)建新結(jié)點(diǎn)*/s->data=a[i];r->next=s;/*將*s插入*r之后*/r=s;}r->next=NULL; /*終端結(jié)點(diǎn)next域置為NULL*/}第30頁(yè)adcbi=0i=1i=2i=3head頭結(jié)點(diǎn)adcbb∧采取尾插法建立單鏈表過(guò)程模塊1:線性結(jié)構(gòu)第31頁(yè)
例設(shè)C={a1,b1,a2,b2,…,an,bn}為一線性表,采取帶頭結(jié)點(diǎn)hc單鏈表存放,編寫(xiě)一個(gè)算法,將其拆分為兩個(gè)線性表,使得:A={a1,a2,…,an},B={b1,b2,…,bn}模塊1:線性結(jié)構(gòu)第32頁(yè)
解:設(shè)拆分后兩個(gè)線性表都用帶頭結(jié)點(diǎn)單鏈表存放。先建立兩個(gè)頭結(jié)點(diǎn)*ha和*hb,它們用于存放拆分后線性表A和B,ra和rb分別指向這兩個(gè)單鏈表表尾,用p指針掃描單鏈表hc,將當(dāng)前結(jié)點(diǎn)*p鏈到ha未尾,p沿next域下移一個(gè)結(jié)點(diǎn),若不為空,則當(dāng)前結(jié)點(diǎn)*p鏈到hb未尾,p沿next域下移一個(gè)結(jié)點(diǎn),如此這么,直到p為空。最終將兩個(gè)尾結(jié)點(diǎn)next域置空。對(duì)應(yīng)算法以下:模塊1:線性結(jié)構(gòu)第33頁(yè)voidfun(LinkList*hc,LinkList*&ha,LinkList*&hb){LinkList*p=hc->next,*ra,*rb;ha=hc; /*ha頭結(jié)點(diǎn)利用hc頭結(jié)點(diǎn)*/ra=ha;/*ra一直指向ha末尾結(jié)點(diǎn)*/hb=(LinkList*)malloc(sizeof(LinkList));/*創(chuàng)建hb頭結(jié)點(diǎn)*/rb=hb;/*rb一直指向hb末尾結(jié)點(diǎn)*/模塊1:線性結(jié)構(gòu)第34頁(yè)while(p!=NULL){ra->next=p;ra=p;/*將*p鏈到ha單鏈表未尾*/p=p->next;rb->next=p;rb=p; /*將*p鏈到hb單鏈表未尾*/p=p->next;}ra->next=rb->next=NULL;/*兩個(gè)尾結(jié)點(diǎn)next域置空*/}模塊1:線性結(jié)構(gòu)第35頁(yè)例已知線性表元素遞增有序,并以帶頭結(jié)點(diǎn)單鏈表作存放結(jié)構(gòu),設(shè)計(jì)一個(gè)高效算法,刪除表中全部值大于mink且小于maxk元素(若表中存在這么元素)。并分析所寫(xiě)算法時(shí)間復(fù)雜度。模塊1:線性結(jié)構(gòu)第36頁(yè)
解:先在單鏈表中找到其data值則好大于mink結(jié)點(diǎn)*p,其前驅(qū)結(jié)點(diǎn)為*pre。繼續(xù)沿next鏈查找其值大于maxk結(jié)點(diǎn),在這個(gè)過(guò)程中刪除*p結(jié)點(diǎn)。算法以下:
voiddelnode(SNode*h,ElemTypemaxk,ElemTypemink){ SNode*p,*pre; if(maxk>=mink) {pre=h; p=pre->next;模塊1:線性結(jié)構(gòu)第37頁(yè)while(p!=NULL&&p->data<=mink) {pre=p;p=p->next; } while(p!=NULL&&p->data<maxk)//刪除*p { pre->next=p->next; free(p); p=pre->next; } }}模塊1:線性結(jié)構(gòu)第38頁(yè)
■雙鏈表基本運(yùn)算實(shí)現(xiàn)
重點(diǎn):插入和刪除結(jié)點(diǎn)算法。模塊1:線性結(jié)構(gòu)第39頁(yè)
■循環(huán)鏈表基本運(yùn)算實(shí)現(xiàn)
重點(diǎn):判斷最終一個(gè)結(jié)點(diǎn)。模塊1:線性結(jié)構(gòu)第40頁(yè)例某線性表最慣用操作是在最終一個(gè)結(jié)點(diǎn)之后插入一個(gè)結(jié)點(diǎn)或刪除第一個(gè)結(jié)點(diǎn),故采取
存放方式最節(jié)約運(yùn)算時(shí)間。A.單鏈表 B.僅有頭結(jié)點(diǎn)單循環(huán)鏈表C.雙鏈表 D.僅有尾指針單循環(huán)鏈表模塊1:線性結(jié)構(gòu)第41頁(yè)例設(shè)計(jì)一個(gè)算法在單鏈表中查找元素值為e結(jié)點(diǎn)序號(hào)算法LocateElem(L,e)。思緒:在單鏈表L中從頭開(kāi)始找第1個(gè)值域與e相等結(jié)點(diǎn),若存在這么結(jié)點(diǎn),則返回位置,不然返回0。
intLocateElem(LinkList*L,ElemTypee){ LinkList*p=L->next;intn=1; while(p!=NULL&&p->data!=e) {p=p->next;n++;} if(p==NULL)return(0); elsereturn(n);}第42頁(yè)解:本題答案為D。在有尾指針r單循環(huán)鏈表中在最終一個(gè)結(jié)點(diǎn)之后插入結(jié)點(diǎn)*s操作是:s->next=r->next;r->next=s;r=s。刪除第一個(gè)結(jié)點(diǎn)操作是:p=r->next;r->next=p->next;free(p)。其時(shí)間復(fù)雜度均為O(1)。模塊1:線性結(jié)構(gòu)第43頁(yè)2.棧
(1)棧定義棧是一個(gè)先進(jìn)后出表?xiàng);具\(yùn)算:進(jìn)棧,出棧。邏輯結(jié)構(gòu)模塊1:線性結(jié)構(gòu)第44頁(yè)
例已知一個(gè)棧進(jìn)棧序列是1,2,3,…,n,其輸出序列是p1,p2,…,pn,若p1=n,則pi值
。 (A)i (B)n-i (C)n-i+1 (D)不確定答:當(dāng)p1=n時(shí),輸出序列必是n,n-1,…,3,2,1,則有:p2=n-1,p3=n-2,…,pn=1推斷出pi=n-i+1,所以本題答案為C。第45頁(yè)
例設(shè)n個(gè)元素進(jìn)棧序列是1,2,3,…,n,其輸出序列是p1,p2,…,pn,若p1=3,則p2值
。 (A)一定是2 (B)一定是1 (C)不可能是1 (D)以上都不對(duì)答:當(dāng)p1=3時(shí),說(shuō)明1,2,3先進(jìn)棧,馬上出棧3,然后可能出棧,即為2,也可能4或后面元素進(jìn)棧,再出棧。所以,p2可能是2,也可能是4,…,n,但一定不能是1。所以本題答案為C。模塊1:線性結(jié)構(gòu)第46頁(yè)(2)次序棧typedefstruct{ ElemTypeelem[MaxSize];inttop; /*棧指針*/}SqStack;存放結(jié)構(gòu)之一模塊1:線性結(jié)構(gòu)第47頁(yè)棧空條件:s.top==-1棧滿條件:s.top==MaxSize-1進(jìn)棧:top++;s.data[s.top]=e;出棧:e=s.data[s.top];s.top—;
次序棧4要素:模塊1:線性結(jié)構(gòu)第48頁(yè)(3)鏈棧
typedefstructlinknode{ ElemTypedata; /*數(shù)據(jù)域*/structlinknode*next; /*指針域*/}LiStack;存放結(jié)構(gòu)之二模塊1:線性結(jié)構(gòu)第49頁(yè)帶頭結(jié)點(diǎn)單鏈表來(lái)實(shí)現(xiàn)(也可不帶頭結(jié)點(diǎn))??諚l件:s->next==NULL棧滿條件:?模塊1:線性結(jié)構(gòu)第50頁(yè)3.隊(duì)列
(1)隊(duì)列定義
隊(duì)列是一個(gè)先進(jìn)先出表。隊(duì)列基本運(yùn)算:進(jìn)隊(duì),出隊(duì)邏輯結(jié)構(gòu)模塊1:線性結(jié)構(gòu)第51頁(yè)(2)次序隊(duì)typedefstruct{ ElemTypeelem[MaxSize];intfront,rear;/*隊(duì)首和隊(duì)尾指針*/}SqQueue;
存放結(jié)構(gòu)之一模塊1:線性結(jié)構(gòu)第52頁(yè)隊(duì)空:q.front==q.rear隊(duì)滿:(q.rear+1)%MaxSize==q.front進(jìn)隊(duì):q.rear=(q.rear+1)%MaxSize;q.data[q.rear]=e;出隊(duì):q.front=(q.front+1)%MaxSize;e=q.data[q.front];
環(huán)形隊(duì)列4要素:模塊1:線性結(jié)構(gòu)第53頁(yè)(3)鏈隊(duì)structqnode/*數(shù)據(jù)結(jié)點(diǎn)*/{ElemTypedata;structqnode*next;}QNode;typedefstruct/*頭結(jié)點(diǎn)*/{QNode*front;QNode*rear;}LiQueue;存放結(jié)構(gòu)之二模塊1:線性結(jié)構(gòu)第54頁(yè)(2)次序串
(3)鏈串
(4)串模式匹配算法(不作要求)4.串(1)串定義
串、子串、串相等、空串、空格串模塊1:線性結(jié)構(gòu)第55頁(yè)5.數(shù)組和稀疏矩陣
(1)數(shù)組定義相同類(lèi)型數(shù)據(jù)元素、有限序列模塊1:線性結(jié)構(gòu)第56頁(yè)(2)數(shù)組存放結(jié)構(gòu)
以行序?yàn)橹餍?LOC(ai,j)=LOC(ac1,c2)+[(i-c1)*(d2-c2+1)+(j-c2)]*k
以列序?yàn)橹餍騆OC(ai,j)=LOC(ac1,c2)+[(j-c2)*(d1-c1+1)+(i-c1)]*k
以數(shù)組A[c1..d1,c2..d2]為例模塊1:線性結(jié)構(gòu)第57頁(yè)(3)特殊矩陣壓縮存放■對(duì)稱矩陣
若一個(gè)n階方陣A[n][n]中元素滿足ai,j=aj,i(0≤i,j≤n-1),則稱其為n階對(duì)稱矩陣。
A[0..n-1][0..n-1]
B[0..n(n+1)/2]
i(i+1)/2+j 當(dāng)i≥j時(shí)k=j(j+1)/2+i 當(dāng)i<j時(shí)模塊1:線性結(jié)構(gòu)第58頁(yè)■三角矩陣
采取類(lèi)似壓縮方法.模塊1:線性結(jié)構(gòu)第59頁(yè)(4)稀疏矩陣存放結(jié)構(gòu):■三元組表示■十字鏈表表示
各種表示基本思緒。非零元素遠(yuǎn)小于元素總數(shù)。模塊1:線性結(jié)構(gòu)第60頁(yè)
■一個(gè)廣義表中所含元素個(gè)數(shù)稱為它長(zhǎng)度.6.廣義表GL=(a,(a),(a,b,c,d),())長(zhǎng)度為4。模塊1:線性結(jié)構(gòu)第61頁(yè)
■一個(gè)廣義表中括號(hào)嵌套最大次數(shù)為它深度.GL=(a,(a),(a,b,c,d),())深度為2。模塊1:線性結(jié)構(gòu)第62頁(yè)
■表第一個(gè)元素a1為廣義表GL表頭,其余部分(a2,…,ai,ai+1,…,an)為GL表尾.
GL=(a,(a),(a,b,c,d),())表頭為a,表尾為((a),(a,b,c,d),())模塊1:線性結(jié)構(gòu)第63頁(yè)模塊2:樹(shù)形結(jié)構(gòu)
(1)樹(shù)定義遞歸定義適合于表示層次結(jié)構(gòu)數(shù)據(jù)1.樹(shù)第64頁(yè)(2)樹(shù)表示法(邏輯表示方法)■樹(shù)形表示法■文氏圖表示法■凹入表示法■括號(hào)表示法模塊2:樹(shù)形結(jié)構(gòu)
第65頁(yè)(3)樹(shù)遍歷■先根遍歷算法■后根遍歷算法模塊2:樹(shù)形結(jié)構(gòu)
第66頁(yè)(4)樹(shù)和二叉樹(shù)相互轉(zhuǎn)換■樹(shù)二叉樹(shù)■二叉樹(shù)樹(shù)模塊2:樹(shù)形結(jié)構(gòu)
第67頁(yè)2.二叉樹(shù)
(1)二叉樹(shù)定義根、左子樹(shù)、右子樹(shù)完全二叉樹(shù),滿二叉樹(shù)定義模塊2:樹(shù)形結(jié)構(gòu)
第68頁(yè)
性質(zhì)1非空二叉樹(shù)上葉結(jié)點(diǎn)數(shù)等于雙分支結(jié)點(diǎn)數(shù)加1。即n0=n2+1.
性質(zhì)2非空二叉樹(shù)上第i層上至多有2i-1個(gè)結(jié)點(diǎn)(i≥1)。(2)二叉樹(shù)性質(zhì)模塊2:樹(shù)形結(jié)構(gòu)
第69頁(yè)
性質(zhì)3高度為h二叉樹(shù)至多有2h-1個(gè)結(jié)點(diǎn)(h≥1)。
性質(zhì)4完全二叉樹(shù)性質(zhì)。
性質(zhì)5含有n個(gè)(n>0)結(jié)點(diǎn)完全二叉樹(shù)高度為
log2n+1
或
log2n
+1。(2)二叉樹(shù)性質(zhì)模塊2:樹(shù)形結(jié)構(gòu)
第70頁(yè)
例將一棵有99個(gè)結(jié)點(diǎn)完全二叉樹(shù)從根這一層開(kāi)始,每一層從左到右依次對(duì)結(jié)點(diǎn)進(jìn)行編號(hào),根結(jié)點(diǎn)編號(hào)為1,則編號(hào)為49結(jié)點(diǎn)右孩子編號(hào)為
。
A.98B.99C.50D.不存在
答:D模塊2:樹(shù)形結(jié)構(gòu)
第71頁(yè)例
深度為5二叉樹(shù)至多有
個(gè)結(jié)點(diǎn)。
A.16B.32C.31D.10
答:相同滿度時(shí)滿二叉樹(shù)結(jié)點(diǎn)最多,h=5滿二叉樹(shù)結(jié)點(diǎn)個(gè)數(shù)=25-1=31。C。模塊2:樹(shù)形結(jié)構(gòu)
第72頁(yè)(3)二叉樹(shù)存放結(jié)構(gòu)
■二叉樹(shù)次序存放結(jié)構(gòu)模塊2:樹(shù)形結(jié)構(gòu)
ABCDEF1234567891011121314ABCDEF第73頁(yè)i2i2i+1左孩子右孩子第74頁(yè)■二叉鏈存放結(jié)構(gòu)
typedefstructnode{ ElemTypedata; /*數(shù)據(jù)元素*/ structnode*lchild;/*指向左孩子*/ structnode*rchild;/*指向右孩子*/}BTNode;第75頁(yè)ABC左孩子右孩子第76頁(yè)(4)二叉樹(shù)遍歷
■先序遍歷■中序遍歷■后序遍歷■層次遍歷通慣用遞歸算法實(shí)現(xiàn)通慣用隊(duì)列來(lái)實(shí)現(xiàn)模塊2:樹(shù)形結(jié)構(gòu)
第77頁(yè)例假設(shè)二叉樹(shù)采取二叉鏈存放結(jié)構(gòu)存放,試設(shè)計(jì)一個(gè)算法,輸出一棵給定二叉樹(shù)全部葉子結(jié)點(diǎn)。解:輸出一棵二叉樹(shù)全部葉子結(jié)點(diǎn)遞歸模型f()以下:f(b):不做任何事件 若b=NULLf(b):輸出*b結(jié)點(diǎn)data域若*b為葉子結(jié)點(diǎn)f(b):f(b->lchild);f(b->rchild) 其它情況模塊2:樹(shù)形結(jié)構(gòu)
第78頁(yè)
voidDispLeaf(BTNode*b){if(b!=NULL){ if(b->lchild==NULL&&b->rchild==NULL) printf("%c",b->data); DispLeaf(b->lchild); DispLeaf(b->rchild);}}模塊2:樹(shù)形結(jié)構(gòu)
先序遍歷思想第79頁(yè)例試設(shè)計(jì)判斷兩棵二叉樹(shù)是否相同算法,所謂二叉樹(shù)t1和t2是相同指是t1和t2都是空二叉樹(shù);或者t1和t2根結(jié)點(diǎn)是相同,t1左子樹(shù)和t2左子樹(shù)是相同且t1右子樹(shù)與t2右子樹(shù)是相同。模塊2:樹(shù)形結(jié)構(gòu)
第80頁(yè)解本題遞歸模型以下:true 若t1=t2=NULLf(t1,t2)=false 若t1、t2之一為NULL,另一不為NULLf(t1->lchild,t2->lchild)&&f(t1->rchild,t2->rchild) 其它情況
對(duì)應(yīng)算法以下:模塊2:樹(shù)形結(jié)構(gòu)
第81頁(yè)intlike(BTNode*b1,BTNode*b2){ intlike1,like2; if(b1==NULL&&b2==NULL) return1; elseif(b1==NULL||b2==NULL) return0; else {like1=like(b1->lchild,b2->lchild); like2=like(b1->rchild,b2->rchild); return(like1&like2); }}模塊2:樹(shù)形結(jié)構(gòu)
后序遍歷思想第82頁(yè)例設(shè)計(jì)一個(gè)算法求二叉樹(shù)全部結(jié)點(diǎn)個(gè)數(shù)。解:對(duì)應(yīng)算法以下:intnodenum(BTNode*bt){if(bt!=NULL)return(nodenum(bt->lchild)+nodenum(bt->lchild)+1);elsereturn(0);}模塊2:樹(shù)形結(jié)構(gòu)
后序遍歷思想第83頁(yè)例設(shè)計(jì)一個(gè)算法釋放一棵二叉樹(shù)bt全部結(jié)點(diǎn)。解:算法以下:voidrelease(BSTNode*&bt){if(bt!=NULL){release(bt->lchild);release(bt->rchild);free(bt);}}模塊2:樹(shù)形結(jié)構(gòu)
后序遍歷思想第84頁(yè)(5)線索二叉樹(shù)
共有2n-(n-1)=n+1個(gè)空鏈域線索化模塊2:樹(shù)形結(jié)構(gòu)
線索化與某種遍歷方式相關(guān)第85頁(yè)3.哈夫曼樹(shù)(1)哈夫曼樹(shù)定義WPL最小,沒(méi)有單分支結(jié)點(diǎn)即n1=0模塊2:樹(shù)形結(jié)構(gòu)
第86頁(yè)(2)哈夫曼樹(shù)結(jié)構(gòu)過(guò)程(3)哈夫曼編碼結(jié)構(gòu)過(guò)程模塊2:樹(shù)形結(jié)構(gòu)
第87頁(yè)■頂點(diǎn)度、入度和出度■完全圖■子圖■路徑和路徑長(zhǎng)度■連通、連通圖和連通分量■強(qiáng)連通圖和強(qiáng)連通分量■權(quán)和網(wǎng)
模塊3:圖形結(jié)構(gòu)(1)圖基本概念第88頁(yè)(2)圖存放結(jié)構(gòu)■鄰接矩陣存放方法
掌握兩種存放方法優(yōu)缺點(diǎn),同一個(gè)功效在不一樣存放結(jié)構(gòu)上實(shí)現(xiàn)算法?!鲟徑颖泶娣欧椒K3:圖形結(jié)構(gòu)第89頁(yè)(3)圖遍歷
■深度優(yōu)先搜索遍歷
離初始點(diǎn)越遠(yuǎn)越優(yōu)先訪問(wèn)。1267354訪問(wèn)序列:1,2,3,4,5,6,7模塊3:圖形結(jié)構(gòu)第90頁(yè)voidDFS(ALGraph*G,intv){ArcNode*p;Visited[v]=1;/*置已訪問(wèn)標(biāo)識(shí)*/printf("%d",v); /*輸出被訪問(wèn)頂點(diǎn)編號(hào)*/p=G->adjlist[v].firstarc;while(p!=NULL){if(visited[p->adjvex]==0) DFS(G,p->adjvex);p=p->nextarc; }}模塊3:圖形結(jié)構(gòu)第91頁(yè)1267354■廣度優(yōu)先搜索遍歷
離初始點(diǎn)越近越優(yōu)先訪問(wèn)。訪問(wèn)序列:1,2,6,7,3,5,4模塊3:圖形結(jié)構(gòu)第92頁(yè)voidBFS(ALGraph*G,intv){ ArcNode*p; intqueue[MAXV],front=0,rear=0; intvisited[MAXV];intw,i; for(i=0;i<G->n;i++)visited[i]=0; printf("%2d",v); visited[v]=1; /*置已訪問(wèn)標(biāo)識(shí)*/ rear=(rear+1)%MAXV; queue[rear]=v;/*v進(jìn)隊(duì)*/模塊3:圖形結(jié)構(gòu)第93頁(yè) while(front!=rear)/*若隊(duì)列不空時(shí)循環(huán)*/ { front=(front+1)%MAXV; w=queue[front];/*出隊(duì)并賦給w*/ p=G->adjlist[w].firstarc; while(p!=NULL) {if(visited[p->adjvex]==0) {printf("%2d",p->adjvex); visited[p->adjvex]=1; rear=(rear+1)%MAXV; queue[rear]=p->adjvex; } p=p->nextarc; } }}模塊3:圖形結(jié)構(gòu)第94頁(yè)例試以鄰接表為存放結(jié)構(gòu),分別寫(xiě)出基于DFS和BPS遍歷算法來(lái)判別頂點(diǎn)i和頂點(diǎn)j(i≠j)之間是否有路徑。解:先置全局變量visited[]為0,然后從頂點(diǎn)i開(kāi)始進(jìn)行某種遍歷,遍歷之后,若visited[j]=0,說(shuō)明頂點(diǎn)i與頂點(diǎn)j之間沒(méi)有路徑;不然說(shuō)明它們之間存在路徑。模塊3:圖形結(jié)構(gòu)第95頁(yè)基于DFS遍歷算法以下:intvisited[MaxVertexNum];intDFSTrave(ALGraph*G,inti,intj){intk;for(k=0;k<G->n;k++)visited[k]=0;DFS(G,i);//從頂點(diǎn)i開(kāi)始進(jìn)行深度優(yōu)先遍歷if(visited[j]==0)return0;elsere
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 商丘學(xué)院《建筑信息建模(BM)》2023-2024學(xué)年第二學(xué)期期末試卷
- 九江理工職業(yè)學(xué)院《動(dòng)物病毒與人類(lèi)健康》2023-2024學(xué)年第二學(xué)期期末試卷
- 湖南工程學(xué)院《數(shù)據(jù)結(jié)構(gòu)與算法分析課程設(shè)計(jì)》2023-2024學(xué)年第二學(xué)期期末試卷
- 《活動(dòng)二 安全網(wǎng)上行》(教學(xué)設(shè)計(jì))-2023-2024學(xué)年六年級(jí)上冊(cè)綜合實(shí)踐活動(dòng)蒙滬版
- 遼寧現(xiàn)代服務(wù)職業(yè)技術(shù)學(xué)院《美術(shù)表現(xiàn)一中國(guó)畫(huà)》2023-2024學(xué)年第二學(xué)期期末試卷
- 海南外國(guó)語(yǔ)職業(yè)學(xué)院《自然地理基礎(chǔ)》2023-2024學(xué)年第二學(xué)期期末試卷
- 地震數(shù)據(jù)采集系統(tǒng)項(xiàng)目效益評(píng)估報(bào)告
- 山東商務(wù)職業(yè)學(xué)院《工程技術(shù)基礎(chǔ)》2023-2024學(xué)年第二學(xué)期期末試卷
- 鄭州商貿(mào)旅游職業(yè)學(xué)院《跨境電商平臺(tái)操作》2023-2024學(xué)年第二學(xué)期期末試卷
- 武漢商學(xué)院《文獻(xiàn)檢索與學(xué)術(shù)訓(xùn)練》2023-2024學(xué)年第二學(xué)期期末試卷
- 《導(dǎo)游基礎(chǔ)知識(shí)》課件-第二章 中國(guó)民族民俗
- 2024年全國(guó)職業(yè)院校技能大賽高職組(建筑裝飾數(shù)字化施工賽項(xiàng))備賽試題庫(kù)(含答案)
- 2024年單招職業(yè)技能測(cè)試題庫(kù)及參考答案(基礎(chǔ)題)
- 旅游服務(wù)質(zhì)量評(píng)價(jià)體系優(yōu)化策略
- 圍手術(shù)期護(hù)理管理制度
- T-CAME 59-2023 醫(yī)院消毒供應(yīng)中心建設(shè)與運(yùn)行管理標(biāo)準(zhǔn)
- 2024屆高考政治一輪復(fù)習(xí)經(jīng)濟(jì)學(xué)名詞解釋
- 幼兒園大班音樂(lè)教案《我們多快樂(lè)》
- GB/T 22919.9-2024水產(chǎn)配合飼料第9部分:大口黑鱸配合飼料
- 《草船借箭》課本劇劇本-4篇
- 體育與兒童心理健康教育教材教學(xué)課件
評(píng)論
0/150
提交評(píng)論