數(shù)據(jù)結(jié)構(gòu)考研考點(diǎn)講義_第1頁(yè)
數(shù)據(jù)結(jié)構(gòu)考研考點(diǎn)講義_第2頁(yè)
數(shù)據(jù)結(jié)構(gòu)考研考點(diǎn)講義_第3頁(yè)
數(shù)據(jù)結(jié)構(gòu)考研考點(diǎn)講義_第4頁(yè)
數(shù)據(jù)結(jié)構(gòu)考研考點(diǎn)講義_第5頁(yè)
已閱讀5頁(yè),還剩111頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)》考研分析與指導(dǎo)~、考試特點(diǎn)分1.在計(jì)算機(jī)專業(yè)碩士研究生入學(xué)全國(guó)統(tǒng)考中,作為專業(yè)課綜合中的一個(gè)版塊進(jìn)行考察。在部分自主命題院校碩士研究生入學(xué)考試中有單獨(dú)作為一個(gè)科目進(jìn)行考察,也有和其他一門或者兩門科目聯(lián)合出題。2.出題形式多為選擇題和綜合應(yīng)用3.側(cè)重于基礎(chǔ)知識(shí)點(diǎn)及對(duì)知識(shí)點(diǎn)靈活運(yùn)用的考二、復(fù)習(xí)方1.分清復(fù)習(xí)的階段,把握復(fù)習(xí)進(jìn)2.親手做題,在練習(xí)中總結(jié)出題方向和方法,重視真題,透徹分析,揣摩出題人心理。只有做好一定量的習(xí)題,才能幫助理解和牢固掌握考點(diǎn)。3.講過(guò)的知識(shí)點(diǎn)和題徹底掌握并及時(shí)回顧,不要學(xué)過(guò)忘過(guò)。4.注重知識(shí)點(diǎn)之間的聯(lián)系5.不可忽視基礎(chǔ)概念和知識(shí)體系。但是同時(shí)還要做到重點(diǎn)突出,突破難點(diǎn),查缺補(bǔ)漏三、考試內(nèi)容及分值分布章重難必考考試題1.緒選2.線性√√√選擇、綜合分3.棧和隊(duì)√√√選擇、綜合分4.√√選擇、填5.?dāng)?shù)組和廣義選擇、填6.√√√選擇、綜合分7.√√√選擇、綜合分8.查√√√選擇、綜合分9.排√√√選擇、綜合分1四章知識(shí)題型題型易考1數(shù)據(jù)結(jié)構(gòu)的定義、邏輯結(jié)構(gòu)的分類、算法的定義和算雜度物理結(jié)構(gòu)性能的選題邏輯結(jié)構(gòu)和物理結(jié)構(gòu)的和算法性能的復(fù)雜度分類、法的定義2性表的概念及運(yùn)算性表的順序存儲(chǔ)性表的鏈?zhǔn)酱鎯?chǔ)元多項(xiàng)式的表示及加選題1.線性表的定義和基本運(yùn)算2.線性表的順序存儲(chǔ)3.線性表的鏈?zhǔn)酱婢C合析題1.線性表算法的設(shè)的定義和運(yùn)的順序存儲(chǔ)和鏈?zhǔn)絻?chǔ)選題1.棧和隊(duì)列的定義和2.棧和隊(duì)列的順序鏈?zhǔn)酱鎯?chǔ)3棧隊(duì)的應(yīng)列的定義和運(yùn)列的順序存儲(chǔ)和鏈?zhǔn)搅械膽?yīng)用存儲(chǔ)綜合析題棧和隊(duì)列的應(yīng)用算4類型的定的順序存儲(chǔ)和鏈?zhǔn)酱娴哪J狡ヅ渌惴▋?chǔ)選題1.串的定義和存綜合析題2.串的模式匹配算5組的定義和運(yùn)組的順序存儲(chǔ)和實(shí)現(xiàn)殊矩陣的壓縮存儲(chǔ)義表選題數(shù)組和廣義表的定義和存儲(chǔ)矩陣的壓縮存儲(chǔ)的概念與定叉樹(shù)的定義和存儲(chǔ)構(gòu)選題樹(shù)與二叉樹(shù)的定義和存儲(chǔ)結(jié)構(gòu)樹(shù)、森林和二叉樹(shù)的關(guān)系6二叉樹(shù)的遍歷與線索、森林和二叉樹(shù)的關(guān)系夫曼樹(shù)及其應(yīng)用綜合析題哈夫曼樹(shù)及其應(yīng)圖的定義與圖的存儲(chǔ)構(gòu)選題圖的定義和存儲(chǔ)結(jié)7的小撲短關(guān)鍵路徑綜合析題生排路路樹(shù)2續(xù)章知識(shí)題題型易考選擇查找的定義順序查找查找基本概念折半查找8基于靜基于綜合分題查找哈希的查找平衡二叉排序樹(shù)B樹(shù)哈希沖突的解決9①插入排②交換排③選擇排④歸并排⑤基數(shù)排綜合分題各種排序方法的應(yīng)用3第一 緒~、考試分考重點(diǎn)與難考中常見(jiàn)題復(fù)習(xí)思路與方數(shù)邏、四綜1.熟和物;練,結(jié)?構(gòu)二、考點(diǎn)講數(shù)據(jù)結(jié)構(gòu)是一門研究非數(shù)值計(jì)算的程序設(shè)計(jì)問(wèn)題時(shí)處理的操作對(duì)象以及它們之間的關(guān)系和操作等等的學(xué)科。1.基本概·數(shù)據(jù)(Data)對(duì)客觀事物的符號(hào)描述,能輸入到計(jì)算機(jī)中并被計(jì)算機(jī)程序處理的符號(hào)的總稱;能被計(jì)算機(jī)識(shí)別、存儲(chǔ)和加工處理的信息的載體。字母:a~z,單詞圖視頻、音頻信號(hào)等表格·數(shù)據(jù)元素(DataElement)數(shù)據(jù)元素是組成數(shù)據(jù)的基本單位,是數(shù)據(jù)集合的個(gè)體,在計(jì)算機(jī)中通常作為一個(gè)整體進(jìn)行考慮和處理。例,“對(duì)弈樹(shù)”中的一個(gè)格4目目信息中的一條書(shū)數(shù)據(jù)項(xiàng):一個(gè)數(shù)據(jù)元素可由若干個(gè)數(shù)據(jù)項(xiàng)組成例,一條書(shū)目信息是由書(shū)名、作者名、分類等多個(gè)數(shù)據(jù)項(xiàng)組成的數(shù)據(jù)項(xiàng)是數(shù)據(jù)的不可分割的最小單位。例如:有一個(gè)學(xué)生表如下所示。這個(gè)表中的數(shù)據(jù)元素是學(xué)生記錄,每個(gè)數(shù)據(jù)元素由四個(gè)數(shù)據(jù)(即學(xué)號(hào)、姓別、性別和班號(hào))組成學(xué)姓性班1張男8劉女李女陳男王男董男5王女·數(shù)據(jù)結(jié)構(gòu)(Data數(shù)據(jù)結(jié)構(gòu)是指相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素集合結(jié)構(gòu)(Structure):數(shù)據(jù)元素相互之間的關(guān)系。在形式上可用二元組表示:DataStructure=(D,D:數(shù)據(jù)元素的有限集S:D上關(guān)系的有限集D={ki|1≤n0ki示集合D中的第i個(gè)結(jié)點(diǎn)或數(shù)據(jù)元n為D中結(jié)點(diǎn)的個(gè)若n=0,則D是一個(gè)空集,表示D無(wú)結(jié)構(gòu)可言,有時(shí)也可以認(rèn)為它具有任意的結(jié)構(gòu)S={rj|1≤mm0rj示集合S中的第j個(gè)二元關(guān)系(簡(jiǎn)稱關(guān)系m為S中關(guān)系的個(gè)若m=0,則S是一個(gè)空集,表明集合D中的元結(jié)點(diǎn)間不存在任何關(guān)系,彼此是獨(dú)立D上的一個(gè)關(guān)系r是序偶的集合,對(duì)于r中的任一序偶<x,y>(x,yD),我們稱序偶的第一結(jié)點(diǎn)為第二結(jié)點(diǎn)的直接前驅(qū)結(jié)點(diǎn)(通常簡(jiǎn)稱前驅(qū)結(jié)點(diǎn)),稱第二結(jié)點(diǎn)為第一結(jié)點(diǎn)的直接后繼結(jié)點(diǎn)(通常簡(jiǎn)稱后繼結(jié)點(diǎn))。如在<x,y>的序偶中,x為y的前驅(qū)結(jié)點(diǎn),而y為x的后繼結(jié)點(diǎn)。若某個(gè)結(jié)點(diǎn)沒(méi)有前驅(qū),則稱該結(jié)點(diǎn)為開(kāi)始結(jié)點(diǎn);若某個(gè)結(jié)點(diǎn)沒(méi)有后繼,則稱該結(jié)點(diǎn)為終端結(jié)點(diǎn);5的節(jié)點(diǎn)稱的節(jié)點(diǎn)稱為內(nèi)部節(jié)點(diǎn)尖括號(hào)”表示有向關(guān)系,“圓括號(hào)”表示無(wú)向關(guān)系例如:用二元組表示學(xué)生表,學(xué)生表中共有7個(gè)結(jié)點(diǎn),依次用k1~k7表示,則對(duì)應(yīng)的二元組表示為:DataStructure=(D,S)其中:D={k1,k2,k3,k4,k5,k6,k7S={<k1,k2>,<k2,k3>,<k3,k4>,<k4,k5>,<k5,k6>,<k6,k7>邏輯結(jié)構(gòu)圖:可以將數(shù)據(jù)結(jié)構(gòu)用圖形形象地表示出來(lái),圖形中的每個(gè)結(jié)點(diǎn)對(duì)應(yīng)著一個(gè)數(shù)據(jù)元素,兩結(jié)點(diǎn)之間的連線對(duì)應(yīng)著關(guān)系中的一個(gè)序偶。上述“學(xué)生表”數(shù)據(jù)結(jié)構(gòu)用下圖的圖形表示2.?dāng)?shù)據(jù)結(jié)構(gòu)的內(nèi)邏輯結(jié)數(shù)據(jù)元素之間的關(guān)邏輯結(jié)構(gòu)可看作是從具體問(wèn)題抽象出來(lái)的數(shù)學(xué)模型按照邏輯關(guān)系的不同特性分類:邏輯結(jié)構(gòu)類型的分(1)線性結(jié)所謂線性結(jié)構(gòu),該結(jié)構(gòu)中的結(jié)點(diǎn)之間存在一對(duì)一的關(guān)系其特點(diǎn)是:開(kāi)始結(jié)點(diǎn)和終端結(jié)點(diǎn)都是惟一的,除了開(kāi)始結(jié)點(diǎn)和終端結(jié)點(diǎn)以外,其余結(jié)點(diǎn)都有且僅有一個(gè)前驅(qū)結(jié)點(diǎn),有且僅有一個(gè)后繼結(jié)點(diǎn)。順序表就是典型的線性結(jié)構(gòu)(2)非線性結(jié)所謂非線性結(jié)構(gòu),該結(jié)構(gòu)中的結(jié)點(diǎn)之間存在一對(duì)多或多對(duì)多的關(guān)系。它又可以細(xì)分為樹(shù)形結(jié)構(gòu)和圖形結(jié)構(gòu)兩類。所謂樹(shù)形結(jié)構(gòu),該結(jié)構(gòu)中的結(jié)點(diǎn)之間存在一對(duì)多的關(guān)系。其特點(diǎn)是每個(gè)結(jié)點(diǎn)最多只有一個(gè)前驅(qū)6有多個(gè)后有多個(gè)后繼,可以有多個(gè)終端結(jié)點(diǎn)。非線性結(jié)構(gòu)樹(shù)形結(jié)構(gòu)簡(jiǎn)稱為樹(shù)UNIX文件系統(tǒng)的系統(tǒng)結(jié)構(gòu)所謂圖形結(jié)構(gòu),該結(jié)構(gòu)中的結(jié)點(diǎn)之間存在多對(duì)多的關(guān)系。其特點(diǎn)是每個(gè)結(jié)點(diǎn)的前驅(qū)和后繼的個(gè)數(shù)都可以是任意的。因此,可能沒(méi)有開(kāi)始結(jié)點(diǎn)和終端結(jié)點(diǎn),也可能有多個(gè)開(kāi)始結(jié)點(diǎn)、多個(gè)終端結(jié)點(diǎn)。圖形結(jié)構(gòu)簡(jiǎn)稱為圖。存儲(chǔ)結(jié)構(gòu)(物理結(jié)構(gòu)邏輯結(jié)構(gòu)在計(jì)算機(jī)中的存儲(chǔ)映象,是邏輯結(jié)構(gòu)在計(jì)算機(jī)中的實(shí)現(xiàn),它包括數(shù)據(jù)元素的表示和關(guān)系的表示。順序存儲(chǔ)結(jié)非順序存儲(chǔ)結(jié)構(gòu)(鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu))索引存儲(chǔ)結(jié)構(gòu)散列存儲(chǔ)結(jié)例如:用順序存儲(chǔ)法和鏈?zhǔn)酱鎯?chǔ)法表示下面的學(xué)生表學(xué)姓性班1張男8劉女李女陳男王男董男5王女用順序存儲(chǔ)法存放學(xué)生表的結(jié)構(gòu)體定義為7structStudint/學(xué)號(hào)charname[8]/姓 charsex[2]/性別charclass[4] Studs[7]= {1,“張斌”,“男”,“9901”}…{5,"王萍","女","9901"}結(jié)構(gòu)體數(shù)組Studs各元素在內(nèi)存中按順序存放,即第i(1i6個(gè)學(xué)生對(duì)應(yīng)的元素Studs[i]存放在第i+1個(gè)學(xué)生對(duì)應(yīng)的元素Studs[i+1]之前,Studs[i+1]正好在Studs[i]之后。用鏈?zhǔn)酱鎯?chǔ)法存放學(xué)生表的結(jié)構(gòu)體定義為:typedefstructnode{學(xué) 姓學(xué) 姓 班/別//指向下charname[8];arsex[2];charclass[4];structnode}

/學(xué)生的指針學(xué)生表構(gòu)成的鏈表如下圖所示。其中的head為第一個(gè)數(shù)據(jù)元素的指針鏈?zhǔn)酱鎯?chǔ)法的缺點(diǎn)存儲(chǔ)空間占用無(wú)法隨機(jī)訪8式式存儲(chǔ)法的優(yōu)點(diǎn)便于修改(插入、刪除、移動(dòng)3.算(1)算法(Algorithm)的定Algorithmisafinitesetofruleswhichgivesasequenceofoperationforsolvingaspecifictypeofproblem.(算法是規(guī)則的有限集合,是為解決特定問(wèn)題而規(guī)定的一系列操作。)(2)算法的特①有窮性:有限步驟之內(nèi)正常結(jié)束,不能形成無(wú)窮循環(huán)②確定性:算法中的每一個(gè)步驟必須有確定含義,無(wú)二義性③可行性:原則上能精確進(jìn)行,操作可通過(guò)已實(shí)現(xiàn)的基本運(yùn)算執(zhí)行有限次而完成④輸入:有多個(gè)或0個(gè)輸入⑤輸出:至少有一個(gè)或多個(gè)輸出在算法的五大特性中,最基本的是有限性、確定性和可行性。4.算法描述的工具描述算法的方自然語(yǔ)言:優(yōu) 簡(jiǎn)單。缺 有歧異,表達(dá)復(fù)雜思想不明晰,不能和實(shí)現(xiàn)方式很好結(jié)高級(jí)程序設(shè)計(jì)語(yǔ)言,如Pascal,C/C++,Java等。優(yōu)點(diǎn) 克服了自然語(yǔ)言的缺點(diǎn),可直接執(zhí)行。缺點(diǎn) 對(duì)部分問(wèn)題的描述比較煩雜, 類語(yǔ)言。和高級(jí)程序設(shè)計(jì)語(yǔ)言類似,但是對(duì)其中一些比較煩雜的部分進(jìn)行和簡(jiǎn)化(原因:類主要目的是為了清晰的表述思想舉例:兩個(gè)數(shù)據(jù)a,b交換空舉自然語(yǔ)言:交換a,b的存儲(chǔ)空間高級(jí)語(yǔ)言:{x=a;a=b;b=x;}類語(yǔ)言:ab;//交換空間5.對(duì)算法作性能評(píng)衡量算法效率的方法主要有兩大類事后統(tǒng)計(jì):利用計(jì)算機(jī)的時(shí)鐘事前分析估算:用高級(jí)語(yǔ)言編寫的程序運(yùn)行的時(shí)間主要取決于如下因素:算法;問(wèn)題規(guī)模使用語(yǔ)言:級(jí)別越高,效率越低;編譯程序;機(jī)器通常,從算法中選取一種對(duì)于研究的問(wèn)題來(lái)說(shuō)是基本操作的原操作,以該基本操作重復(fù)執(zhí)行的次數(shù)作為算法執(zhí)行的時(shí)間度量。基本操作重復(fù)執(zhí)行的次數(shù)分別為1,n,9設(shè)算法的問(wèn)題規(guī)模為頻度:語(yǔ)句重復(fù)執(zhí)行的次數(shù)稱為該語(yǔ)句的頻度,記f(n)對(duì)算法各基本操作的頻度求和,便可得算法的時(shí)間復(fù)雜度。但實(shí)際中我們所關(guān)心的主要是一個(gè)算法所花時(shí)間的數(shù)量級(jí),即取算法各基本操作的最大頻度數(shù)量級(jí)。時(shí)間復(fù)雜度:算法執(zhí)行時(shí)間度量,記T(n)=O(axlevelf(n)))。f(n)=1+n+n2+n3T(n)=O(n3)O的數(shù)學(xué)定義:若T(n)和f(n)是定義在正整數(shù)集合上的兩個(gè)函數(shù),則如果存在正常數(shù)C和n得當(dāng)n≥時(shí),總滿足0Tn)≤Cfn),則記做T(n)=O(f(n))也就是只求出T(n)的最高階(數(shù)量級(jí)),忽略其低階項(xiàng)和常系數(shù),這樣既可簡(jiǎn)化T(n)的計(jì)算,能比較客觀地反映出當(dāng)n很大時(shí),算法的時(shí)間性能。6.算法的空間復(fù)雜度關(guān)于算法的存儲(chǔ)空間需求,類似于算法的時(shí)間復(fù)雜度,我們采用空間復(fù)雜度作為算法所需存儲(chǔ)空間的量度,記作:S(n)=O(f(n)三、真題舉1.從邏輯結(jié)構(gòu)上可以把數(shù)據(jù)結(jié)構(gòu)分為( )兩大類.【武漢交通科技大學(xué)】A.動(dòng)態(tài)結(jié)構(gòu)、靜態(tài)結(jié)構(gòu)B.順序結(jié)構(gòu)、鏈?zhǔn)浇Y(jié)C.線性結(jié)構(gòu)、非線性結(jié)構(gòu)D.初等結(jié)構(gòu)、構(gòu)造型結(jié)2.在下面的程序段中,對(duì)x的賦值語(yǔ)句的頻度為( )【北京工商大學(xué)】FORi:=1TOnDOFORj:=1TOnx:=x+2A.O( B.O( C.O(n2 D.O(log23.以下屬于邏輯結(jié)構(gòu)的是 )【西安電子科技大學(xué)A.順序 B.哈希 C.有序 D.單鏈四、本講小本章講解了數(shù)據(jù)、數(shù)據(jù)結(jié)構(gòu)、算法的基本概念,數(shù)據(jù)的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)。重點(diǎn)講解了數(shù)據(jù)的4種邏輯結(jié)構(gòu)和4種物理結(jié)構(gòu),以及算法復(fù)雜度。第二 線性目錄分2.1線性表的概念及運(yùn)算[一般了解]2.2線性表的順序存儲(chǔ)[熟練掌握]2.3線性表的鏈?zhǔn)酱鎯?chǔ)[熟練掌握]第1~、考試分考重點(diǎn)與難考中常見(jiàn)題復(fù)習(xí)思路與方線性表的基本概念和常用線性表在常用操作、性表選擇題、2.掌握線性表的順序存操作、線性表的順序存儲(chǔ)方式?的順序存儲(chǔ)?綜合分析題儲(chǔ)式和線性表的基本運(yùn)算在現(xiàn)行存方式下的實(shí)現(xiàn)方法?二、考點(diǎn)講2.1 線性表的概念及運(yùn)算1.線性表的定義—個(gè)線性表是具有n個(gè)數(shù)據(jù)元素的有限序列。記為(a1,…,aiaiai…,an2.線性表的長(zhǎng)線性表中元素的個(gè)數(shù)n(n>=0),n=0時(shí),稱為空表。3.位序ai第i個(gè)元素,稱i為數(shù)據(jù)元素ai在線性表中的位序。4.線性表的邏輯結(jié)構(gòu)例子·英文字母表(A,B,…,Z)車輛登記表5.線性表的特同一性:線性表由同類數(shù)據(jù)元素組成,每一個(gè)ai須屬于同一數(shù)據(jù)對(duì)象有窮性:線性表由有限個(gè)數(shù)據(jù)元素組成,表長(zhǎng)度就是表中數(shù)據(jù)元素的個(gè)數(shù)有序性:線性表中相鄰數(shù)據(jù)元素之間存在著序偶關(guān)系<aiai>。6.線性表的基本運(yùn)算初始化InitList(L建立一個(gè)空表求表長(zhǎng)ListLength(L)返回線性表的長(zhǎng)度讀表元素etEmL,i,e用e返回L中第i個(gè)數(shù)據(jù)元素的值定位LaeElemL,e,cme))返回滿足關(guān)系的數(shù)據(jù)元素的位序插入ListInsert(Li,e)在L中第i個(gè)位置之前插入新的數(shù)據(jù)元素e,線性表的長(zhǎng)度增1刪除ListDelete(Li,&e)刪除L的第i個(gè)位置上的數(shù)據(jù)元素e,線性表的長(zhǎng)度減1輸出ListDisplay(L)按前后次序輸出線性表的所有元素練習(xí)1:兩個(gè)線性表LA和LB分別表示兩個(gè)集合A和B,現(xiàn)求一個(gè)新的集合A=∪B。voidunion(ListaListLb){Lalen=ListLength(La);Lblen=ListLength(Lb)for(i=1;i<=Lblen;i++){tEmLb,i,e);if(?。幔澹牛恚蹋?,e,equal))ListInsert(La,++Lalen,e);}}練習(xí)

O(ListLength(La)×ListLength(Lb)兩個(gè)線性表LA和LB中的數(shù)據(jù)元素按值非遞減有序排列,現(xiàn)將LA和LB歸并為一個(gè)新的線性表,LC中的數(shù)據(jù)元素仍按值非遞減有序排列。LA=(3,5,8,LB=(2,6,8,9,11,15,LC=(2,3,5,6,8,8,9,11,11,15,=a,=a,當(dāng)a!b,當(dāng)a>bvoMrgeitListLa,ListLb,List{InitList(Lc)Lalen=ListLength(La); Lblen=ListLength(Lb);i=j=1;k=0;while((i<=Lalen)&&(j<=Lblen)){tEmLa,i,a);tEmLb,j,b);if(a<=b){ListInsert(Lc,++k,a);++i;}else{ListInsert(Lc,++k,b);++j;}}while(i<=Lalen)tEmLa,i++,a);ListInsert(Lc,++k,a);}while(j<=Lblen){tEmLb,j++,b);ListInsert(Lc,++k,b);}O(ListLength(La)+ListLength(Lb))例,La=(3,5,8),Lb=(2,6,8,9,15)構(gòu)造Lc=(2,3,5,6,8,8,9,15)首先,Lalen=3;Lblen=5;2.2 線性表的順序表示和實(shí)現(xiàn)1.順序表:按順序存儲(chǔ)方式構(gòu)造的線性表假設(shè)線性表中有n個(gè)元素,每個(gè)元素占k個(gè)單元,第一個(gè)元素的地址為loc(a),則可以通過(guò)如下公式計(jì)算出第i個(gè)元素的地址loc(ai):loc(ai)=loc(a1)+(i-1)×k其中loc(a1)稱為基地址。2.順序表的特點(diǎn)邏輯結(jié)構(gòu)中相鄰的數(shù)據(jù)元素在存儲(chǔ)結(jié)構(gòu)中仍然相鄰線性表的順序存儲(chǔ)結(jié)構(gòu)是一種隨機(jī)存取的存儲(chǔ)結(jié)構(gòu)。3.順序表的描述:typedef{ElemType //當(dāng)前長(zhǎng) listsize;//分配的存儲(chǔ)容}//ElemTypeelem[Etypedef#Epe #為根據(jù)具體問(wèn)題確定的數(shù)據(jù)類型typedefint 4.順序表上基本運(yùn)算的實(shí)初始化StatusInitListSq(SqList{L.elem=(ElemType)alc(LISTINITSIZEsizeof(ElemType));if(?。蹋澹椋簦ǎ希牛蹋祝唬蹋欤澹睿纾簦瑁剑埃唬蹋欤椋螅簦螅椋澹剑蹋桑樱裕桑危桑裕颍澹簦酰颍睿颍澹簦酰颍睿蹋澹欤澹恚剑睿澹鳎牛欤澹恚裕穑澹郏蹋桑樱裕桑危桑裕樱桑冢牛蓓樞虮淼牟迦耄涸诒碇械冢磦€(gè)元素之前插入“21“順序表中插入元插入StatusListInsertSq(SqListLinti,ElemType{if((i<1)||(i>L.length+1))returnERROR;if(L.length>=L.listsize){realloc(…);….;//越界處理;}q=&(L.elem[i-1])for(p=&(L.elem[L.length-1];p>=q;--(p+1)=p;q=e;++L.length;eturn}//越界處if(L.length>=L.listsize newbase=(ElemType)realloc(L.elem(L.listsize+LISTINCREMENT)sizeof(ElemType));if(!newbase) exit(OVELW;L.elem=newbaseL.listsize+=LISTINCREMENT;算法時(shí)間復(fù)雜度:時(shí)間主要花在移動(dòng)元素上,而移動(dòng)元素的個(gè)數(shù)取決于插入元素位置。i=1,需移動(dòng)n個(gè)元素;ii=n需移動(dòng)0個(gè)元素i=i,需移動(dòng)n-i+1個(gè)元素假設(shè)pi在第i個(gè)元素之前插入一個(gè)新元素的概則長(zhǎng)度為n的線性表中插入一個(gè)元素所需移動(dòng)元素次數(shù)的期望Eis=∑pi(n-i+1)i設(shè)在任何位置插入元素等概率,n

=n+1 n+1(n-i+1)i n+i

O(順序表的歸并,表中元素非遞減排列vidMergsSq(SqListLa,SqListLb,SqListc{pa=La.elem;pb=Lb.Lc.listsize=Lc.length=La.length+Lb.length;pc=Lc.elem=(ElemType)lc…);if(?。蹋悖澹欤澹恚澹椋簦ǎ希郑蹋?;palast=La.elem+La.length-1;pblast=Lb.elem+Lb.length-1;while((pa<=palast)&&pb<=pblast)){if(pa<=pb) pc++=pa++;elsepc++= pb++;}while(pa<=palast)pc++=pa++;while(pb<=pblast) pc++=pb++;}順序表的基礎(chǔ)要點(diǎn)1.無(wú)需為表示元素間的邏輯關(guān)系而增加額外的存儲(chǔ)空間,存儲(chǔ)密度大(100%);2.可隨機(jī)存取表中的任一元素。3.插入或刪除一個(gè)元素時(shí),需平均移動(dòng)表的一半元素,具體的個(gè)數(shù)與該元素的位置有關(guān),在等概率情況下,插入n/2,刪除(n-1)/2;O(n)4.存儲(chǔ)分配只能預(yù)先進(jìn)行分配5.將兩個(gè)各有n個(gè)元素的有序表歸并為一個(gè)有序表,其最少的比較次數(shù)是:n練習(xí)2.29已知A、B、C為三個(gè)元素值遞增有序的順序表,現(xiàn)要求對(duì)A作如下運(yùn)算,刪去那些既在B中出現(xiàn)又在C中出現(xiàn)的元素,實(shí)現(xiàn)上述算法并分析時(shí)間復(fù)雜度。A=A-(A=(1,2,6,6,8,9,10,10,11,15)B=(1,2,6,6,7,9,10,15)C=(3,4,6,7,7,9,9,9,10,==(1,2,8,11,分析先從B和C中找出公有元素,記為eA中從當(dāng)前位置開(kāi)始,凡小于same的元素均保留(存到新的位置),等于same的跳過(guò)大于same時(shí)就再找下一個(gè)voidSqListIntersectDelete(SqListASqListB,SqList pa=A.elem;palast;pb;pblast;pc;pclast;while((pa<=palast)&&(pb<=pblast)&&(pc<=pclast)){if(pb<pc) pb++;elseif(pb>pc)pc++;else{}//

}//

same=while((pb<=pblast)&&(pb==me)pb++;while((pc<=pclast)&&(pc==e)pc++;while((pa<=palast)&&(pa<e)p0++=pa++while((pa<=palast)&&(pa==me)pa++while(pa<=pap0++= A.length=p0"A.elem;}三、真題舉1.下面關(guān)于線性表的敘述中,錯(cuò)誤的是哪一個(gè)?( )【北方交通大學(xué)】A.線性表采用順序存儲(chǔ),必須占用一片連續(xù)的存儲(chǔ)單元。B.線性表采用順序存儲(chǔ),便于進(jìn)行插入和刪除操作C.線性表采用鏈接存儲(chǔ),不必占用一片連續(xù)的存儲(chǔ)單元。D.線性表采用鏈接存儲(chǔ),便于插入和刪除操作。2.若長(zhǎng)度為n的線性表采用順序存儲(chǔ)結(jié)構(gòu),在其第i個(gè)位置插入一個(gè)新元素的算法的時(shí)間復(fù)雜度為( )(1<=i<=n+1)?!颈本┖娇蘸教齑髮W(xué)】A.O( B.O( C.O( D.O(n2四、本講小本講主要講解了:線性表的基本概念和常用操作、線性表的順序存儲(chǔ)方式。??碱}型:選擇題,綜合分析題。應(yīng)試方法:理解并熟練掌握線性表的順序存儲(chǔ)方式和線性表的基本運(yùn)算在現(xiàn)行存儲(chǔ)方式下在現(xiàn)方法第2~、考試分考重點(diǎn)與難考試中常見(jiàn)題復(fù)習(xí)思路與方線性表的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)?綜?二、考點(diǎn)講2.3 線性表的鏈?zhǔn)奖硎竞蛯?shí)現(xiàn)線性表鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)的特點(diǎn):用一組任意的存儲(chǔ)單元存儲(chǔ)線性表的元素,不要求邏輯上相鄰的元素在物理位置上也相鄰插入刪除時(shí)不需移動(dòng)大量元素失去順序表可隨機(jī)存取的優(yōu)點(diǎn)。例,整數(shù)數(shù)組a[3]={3,5,6}1.線性鏈表(單鏈表結(jié)點(diǎn):數(shù)據(jù)元素的存儲(chǔ)映象數(shù)據(jù)域用來(lái)存儲(chǔ)結(jié)點(diǎn)的值指針域用來(lái)存儲(chǔ)數(shù)據(jù)元素的直接后繼的地址(或位置)·指頭指示鏈表中第一個(gè)結(jié)點(diǎn)的存儲(chǔ)位置,單鏈表可由頭指針唯一確定單鏈表的存儲(chǔ)映頭結(jié)在鏈表的第一個(gè)結(jié)點(diǎn)之前附設(shè)一個(gè)結(jié)點(diǎn),頭指針指向頭結(jié)點(diǎn)。設(shè)置頭結(jié)點(diǎn)的目的是統(tǒng)一空表與非空表的操作,簡(jiǎn)化鏈表操作的實(shí)現(xiàn)。首元結(jié)鏈表中存儲(chǔ)線性表中第一個(gè)數(shù)據(jù)元素的結(jié)點(diǎn)鏈表存儲(chǔ)結(jié)構(gòu)描述:TypedefstructLNode{ElemTypestruct 單鏈表基本運(yùn)算實(shí)(1)初始化線性表InitList(該運(yùn)算建立一個(gè)空的單鏈表,即創(chuàng)建一個(gè)頭結(jié)點(diǎn)。voidInitList(LinkListL){L=(LinkList)csizeof(LNode))創(chuàng)/創(chuàng)/L->next=}

建頭結(jié)(2)銷毀線性表DestroyList(釋放單鏈表L占用的內(nèi)存空間。即逐一釋放全部結(jié)點(diǎn)的空間voidvoidDestroyList(LinkList{LinkListp=L,q=p->while( = free(p)p=q;q=p->}free(p)}(3)判線性表是否為空表ListEmpty(若單鏈表L沒(méi)有數(shù)據(jù)結(jié)點(diǎn),則返回真,否則返回假。intListEmpty(LinkListL){return(L->next==NULL)}(4)求線性表的長(zhǎng)度ListLength(L)返回單鏈表L中數(shù)據(jù)結(jié)點(diǎn)的個(gè)數(shù)。intListLength(LinkListL){LinkListp=L;inti=0;while(p->next?。剑危眨蹋蹋椋穑剑穑荆颍澹簦酰颍睿ǎ椋ǎ担┹敵鼍€性表DispList(逐一掃描單鏈表L的每個(gè)數(shù)據(jù)結(jié)點(diǎn),并顯示各結(jié)點(diǎn)的data域值。voidDispList(LinkListL){LinkListp=L->next;while(p!=NULL) printf("%c",p->data);p=p->next;}printf("\n")}(6)取表元StatustEmLinkListL,inti,ElemType{p=L-> j=while(p&&j<i)p=p->next;++}if(!p||j>i)returnERROR;e=p->data;return}例,取第i=3個(gè)元素e=p->data=Sun時(shí)間復(fù)雜度:O(n)·在單鏈表第i個(gè)結(jié)點(diǎn)前插入一個(gè)結(jié)點(diǎn)的過(guò)(7)插StatusListInsert(LinkList&L,inti,ElemType{p=L;j=while(p&&j<i-1){p=p->next;++j}if(?。穑辏荆椋保?returnERROR;s= (LinkList)csizeof(LNode));s->data=e;s->next=p->next;pp->next=s;return}·刪除單鏈表的第i個(gè)結(jié)點(diǎn)的過(guò)(8)刪StatusListDelete(LinkListLinti,ElemType{p=L;j=while(p->next&&j<i-1){p=p->next;++j}if(?。ǎ穑荆睿澹簦辏荆椋保颍澹簦酰颍睿牛遥遥希?;r=p->next;e=r->p->next=p->next-next;//(p->next=r->next;)free(r);returnOK;}·動(dòng)態(tài)建立單鏈表的過(guò)(9)頭插法建CreateListH(LinkListLint{LL=(LinkList)csizeofLNode))L->next=LNode))for(i=n;i>0;--i)s=(LinkList)csizeof(LNode));scanf(&s->data);s->next=L->next;L->next=s;}}·尾插法建(10)尾插法建CreateListT(LinkListLint{tail=L=(LinkList)csizeof(LNode));L->next=NULL;for(i=n;i>0;--i)s=(LinkList)csizeof(LNode));scanf(&s->data);s->next=NULL;tail->next=s;①tail=s;}}(11)按元素值查找ateEmL,思路:在單鏈表L中從頭開(kāi)始找第1個(gè)值域與e相等的結(jié)點(diǎn),若存在這樣的結(jié)點(diǎn),則返回位置,否則返回0。intoaeEmLinkListL,ElemType{{LinkListp=L->next;intn=1;hile(p!=NULL&&p->data?。?p=p->next;n++; if(p==NULL) return(0);elsereturn(n)}練習(xí):已知L是帶頭結(jié)點(diǎn)的非空單鏈表,指針p所指的結(jié)點(diǎn)既不是第一個(gè)結(jié)點(diǎn),也不是最后一個(gè)結(jié)點(diǎn)。刪除 p結(jié)點(diǎn)的直接后繼結(jié)點(diǎn)的語(yǔ)句序列q=p->next;p->next=q->next;free(q);刪除 p結(jié)點(diǎn)的直接前驅(qū)結(jié)點(diǎn)的語(yǔ)句序列q=L;while(q->next->next?。剑穑?q=q->next;s=q->next;q->next=p;free(s);刪除 p結(jié)點(diǎn)的語(yǔ)句序列q=L;while(q->next?。剑穑?q=q->next;q->next=p->next;free(p)刪除首元結(jié)點(diǎn)的語(yǔ)句序列q=L->next;L->next=q->next;free(q);刪除最后一個(gè)結(jié)點(diǎn)的語(yǔ)句序while(p->next->next?。剑危眨蹋蹋?p=p->next;q=p->next;p->next=NULL;free(q);鏈?zhǔn)浇Y(jié)構(gòu)的特點(diǎn)非隨機(jī)存貯結(jié)構(gòu),所以取表元素要慢于順序表。節(jié)約了大塊內(nèi)存適合于插入和刪除操了指針,了指針,使得種操作轉(zhuǎn)換際上用空間換取了時(shí)間,結(jié)點(diǎn)中加兩指針操作2.靜態(tài)鏈有些高級(jí)程序設(shè)計(jì)語(yǔ)言并沒(méi)有指針類型,如FORTRAN和JAVA。我們可以用數(shù)組來(lái)表示和實(shí)現(xiàn)一個(gè)鏈表,稱為靜態(tài)鏈表。可定義如下#defineMAXSIZE //最多元素個(gè)數(shù)typedefstruct{ElemType cur;//游標(biāo),指示}pentSLinkList[XEi=s[i].cur;指針后移操lci=s[0].cur;第一個(gè)可用結(jié)點(diǎn)位if(s[0]. s[0].cur=s[i]. //釋放k結(jié)s[k].cur=s[0].cur;s[0].cur=k;Insert://將i插在r之s[i].cur=s[r].cur;s[r].cur=i;Delete:;//p為k的直接前驅(qū),釋放s[p].cur=s[k].curFree(k);單鏈表基礎(chǔ)要點(diǎn)在單鏈表中,不能從當(dāng)前結(jié)點(diǎn)出發(fā)訪問(wèn)到任一結(jié)點(diǎn)在單鏈表中,刪除某一指定結(jié)點(diǎn)時(shí),必須找到該結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)線性表的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)是一種順序存取的存儲(chǔ)結(jié)構(gòu),不具有隨機(jī)訪問(wèn)任一元素的特點(diǎn)設(shè)置頭結(jié)點(diǎn)的作用:使在鏈表的第一個(gè)位置上的操作和表中其它位置上的操作—致,無(wú)需進(jìn)行特殊處理,對(duì)空表和非空表的處理統(tǒng)一。循環(huán)鏈表循環(huán)鏈表是另一種形式的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)可從當(dāng)前結(jié)點(diǎn)出發(fā),訪問(wèn)到任一結(jié)點(diǎn)循環(huán)單鏈表多重循環(huán)鏈表。單循環(huán)鏈表設(shè)置尾指針rear,比設(shè)頭指針更好連接兩個(gè)只設(shè)尾指針的單循環(huán)鏈表L1和L2操作如下:p=R1">next;//保存L1的頭結(jié)點(diǎn)指針R1->next=R2->next->next;//頭尾連接free(R2->next);//釋放第二個(gè)表的頭結(jié)R2->next=操作與線性單鏈表基本一致,差別只是在于算法中的循環(huán)結(jié)束條件不是p是否為空,而是p是否等于頭指針。例:取循環(huán)鏈表第i個(gè)元素StatusGetElemL( &e =L=L->next;j=1while(p?。剑?j<i p=p->next;++j}if(p==L||j>i)returnERROR;e=p->data;return}雙鏈表希望查找前驅(qū)的時(shí)間復(fù)雜度達(dá)到O(1),我們可以用空間換時(shí)間,每個(gè)結(jié)點(diǎn)再加一個(gè)指向前驅(qū)的指針域,使鏈表可以進(jìn)行雙方向查找。用這種結(jié)點(diǎn)結(jié)構(gòu)組成的鏈表稱為雙向鏈表。結(jié)點(diǎn)的結(jié)構(gòu)圖雙向鏈表的邏輯表示雙向鏈表(DoubleLinkedList)類型描述typedefstruct structDuLNode structDuLNode } 雙向循環(huán)鏈p->next->prior=p->prior->·雙向鏈表的前(后)插入操①s->prior=p-> ②p->prior->next=③s->next= ④p->prior=①s->next=q-> ②q->next->prior=③s->prior= ④q->next=雙向鏈表的刪除操①p->prior->next=p->②p->next->prior=p->刪除 p的直接后繼結(jié)點(diǎn)的語(yǔ)句序列q=p->next;p->next=p->next->next;p->next->prior=p;free(q)刪除 p的直接前驅(qū)結(jié)點(diǎn)的語(yǔ)句序列q=p->prior;p->prior=p->prior->prior;p->prior->next=p;free(q)returnreturn}②找結(jié)點(diǎn)的中序后繼結(jié)結(jié)點(diǎn)p,無(wú)右孩子,右指針指向其后繼,否則p的右子樹(shù)中“最左下”結(jié)點(diǎn)。BiThrTreePostNode(BiThrTreep){post=p->if(p->RTag==0)//有右孩子while(post->LTag==0)post=post->lchild;return}帶頭結(jié)點(diǎn)的線索二叉鏈帶頭結(jié)點(diǎn)的中序線索二叉鏈中序遍歷線索二叉樹(shù) //0:有孩子;1:無(wú)孩子VoidInOrderTraverseThr(BiThrTree {p=T->lchild;while(p!=T)while(p->LTag==0)p=p->lchild;cout<<p->data<<“”;while((p->RTag==1)&&(p->rchild?。剑裕?p=p->rchild;cout<<p->data<<“”;}p=p->}}·按建立線索化鏈表(以中序?yàn)槔龑?duì)某種次序行遍歷,表線索化,要比傳統(tǒng)方式高些。用如線果索程取序代中空經(jīng)指常針要。進(jìn)行二叉樹(shù)的遍歷或需要查找在遍歷過(guò)程中所的線性序列中前驅(qū)和后繼,此時(shí)應(yīng)當(dāng)采用線索鏈表表示。6.4 樹(shù)和森林1.樹(shù)的存儲(chǔ)結(jié)構(gòu)(三種方法雙親表示法:用一組連續(xù)的空間來(lái)存儲(chǔ)樹(shù)中的結(jié)點(diǎn),在保存每個(gè)結(jié)點(diǎn)的同時(shí)附設(shè)一個(gè)指示器來(lái)指示其雙親結(jié)點(diǎn)在表中的位置,其結(jié)點(diǎn)的結(jié)構(gòu)如下:樹(shù)的雙親存儲(chǔ)結(jié)構(gòu)示意#defineMAXTREESIZE100typedefstructPTNode{TElem }PTNode;Typedefstruct{PTNodenodes[MAXTREESIZE] r, //根的位置和結(jié)點(diǎn)}雙親表示法的類型說(shuō)明孩子表示法①定長(zhǎng)結(jié)點(diǎn)長(zhǎng)空鏈域個(gè)數(shù):nk"(n)=n(k-1)+②把每個(gè)結(jié)點(diǎn)的孩子結(jié)點(diǎn)排列起來(lái),構(gòu)成一個(gè)單鏈表,稱為孩子鏈表。n個(gè)結(jié)點(diǎn)共有n個(gè)孩子鏈表(葉子結(jié)點(diǎn)的孩子鏈表為空表),而n個(gè)結(jié)點(diǎn)的數(shù)據(jù)和n個(gè)孩子鏈表的頭指針又組成一個(gè)順序表typedefstructCTNode{/孩子結(jié)點(diǎn)的定 / 該孩子結(jié)點(diǎn)在線性表中的位/ruct結(jié)}ChildPtr;typedefstruct{/pedata; 結(jié)

指向下一個(gè)孩子結(jié)點(diǎn)的指順序表結(jié)點(diǎn)的結(jié)構(gòu)定義 /TElemTy點(diǎn)的信 /ChildPtrFirstChild順指 向孩子鏈表的頭指針指}typedefstruct{

樹(shù)的定 樹(shù)順 nodes[MAXTREESIZE]; 序 順introot,num; 根結(jié)點(diǎn)的位置和樹(shù)的結(jié)點(diǎn)個(gè)數(shù)/}孩子兄弟表示法typedefstructCSNode{結(jié)第ElemType 點(diǎn)信 結(jié)第StructCSNodeFirstChild,NextSibling;} 這種存儲(chǔ)結(jié)構(gòu)便于實(shí)現(xiàn)樹(shù)的各種操作

—個(gè)孩子,下一個(gè)兄弟樹(shù)的孩子兄弟鏈存儲(chǔ)結(jié)構(gòu)示意圖2.樹(shù)、森林與二叉樹(shù)的相互轉(zhuǎn)換·樹(shù)轉(zhuǎn)換為二叉(1)在所有相鄰兄弟結(jié)點(diǎn)之間加一水平連線((2)對(duì)每個(gè)非葉結(jié)點(diǎn)k,除了其最左邊的孩子結(jié)點(diǎn)外,刪去k與其他孩子結(jié)點(diǎn)的連線(3)所有水平線段以左邊結(jié)點(diǎn)為軸心順時(shí)針旋轉(zhuǎn)45度,使之結(jié)構(gòu)層次分明。樹(shù)做這樣的轉(zhuǎn)換所構(gòu)成的二叉樹(shù)是唯一的。樹(shù)與二叉樹(shù)的對(duì)·森林轉(zhuǎn)換為二叉森林也可以方便地用孩子兄弟鏈表表示。森林轉(zhuǎn)換為二叉樹(shù)的方法如下(1)將森林中的每棵樹(shù)轉(zhuǎn)換成相應(yīng)的二叉樹(shù)(2)第一棵二叉樹(shù)不動(dòng),從第二棵二叉樹(shù)開(kāi)始,依次把后一棵二叉樹(shù)的根結(jié)點(diǎn)作為前一棵二叉樹(shù)根結(jié)點(diǎn)的右孩子,當(dāng)所有二叉樹(shù)連在一起后,所得到的二叉樹(shù)就是由森林轉(zhuǎn)換得到的二叉樹(shù)?!ざ鏄?shù)還原為樹(shù)或森將一棵二叉樹(shù)還原為樹(shù)或森林,具體方法如下()若某結(jié)點(diǎn)是其雙親的左孩子,則把該結(jié)點(diǎn)的右孩子、右孩子的右孩子……都與該結(jié)點(diǎn)的雙結(jié)點(diǎn)

線連起來(lái)(2)刪掉原二叉樹(shù)中所有雙親結(jié)點(diǎn)與右孩子結(jié)點(diǎn)的連線(3)整理由(1)、(2)兩步所得到的樹(shù)或森林,使之結(jié)構(gòu)層次分明二叉樹(shù)到森林的轉(zhuǎn)換示3.樹(shù)與森林的遍·樹(shù)的遍歷(兩種1)先根遍若樹(shù)非空,則遍歷方法為①訪問(wèn)根結(jié)點(diǎn)②從左到右,依次先根遍歷根結(jié)點(diǎn)的每一棵子樹(shù)。等同于轉(zhuǎn)換的二叉樹(shù)進(jìn)行先序遍歷先根遍歷序列ABECFHGD2)后根遍歷若樹(shù)非空,則遍歷方法為①?gòu)淖蟮接?,依次后根遍歷根結(jié)點(diǎn)的每一棵子樹(shù)②訪問(wèn)根結(jié)點(diǎn)等同于轉(zhuǎn)換的二叉樹(shù)進(jìn)行中序遍后根遍歷序列為森森林的遍歷(2種1)中序遍若森林非空,則遍歷方法為①訪問(wèn)森林中第一棵樹(shù)的根結(jié)點(diǎn)②先序遍歷第一棵樹(shù)的根結(jié)點(diǎn)的子樹(shù)森林③先序遍歷除去第一棵樹(shù)之后剩余的樹(shù)構(gòu)成的森林。先序遍歷序列為ABCDEFGHIJ等同于轉(zhuǎn)換的二叉樹(shù)進(jìn)行先序遍歷2)先序遍歷若森林非空,則遍歷方法為①中序遍歷森林中第一棵樹(shù)的根結(jié)點(diǎn)的子樹(shù)森林②訪問(wèn)第一棵樹(shù)的根結(jié)點(diǎn)③中序遍歷除去第一棵樹(shù)之后剩余的樹(shù)構(gòu)成的森林。中序遍歷序列為 等同于轉(zhuǎn)換的二叉樹(shù)進(jìn)行中序遍歷4.幾個(gè)問(wèn)題①給定樹(shù)的先根遍歷序列和后根遍歷序列可唯一畫出一棵樹(shù)。先根遍歷序列:ABECFHGD后根遍歷序列:EBHFGCD②給定森林的先序遍歷序列和中序遍歷序列可唯一確定一森林。先序遍歷序列:ABCDEFGHIJ中序遍歷序列:BCDAFEHJI③關(guān)于二叉樹(shù)的先序、中序和后序遍歷序列確定二叉樹(shù)的問(wèn)題·任何n(n0個(gè)不同結(jié)點(diǎn)的二叉樹(shù),都可由它的中序序列和先序序列唯一地確定證明先序序列是a1a2…an中序序列是b1b2…bn根結(jié)點(diǎn):a在中序序列中與a同的結(jié)點(diǎn)為:bj{b1…bj-1}bj{bj+1…bn}←→a1{a2…ak}{ak+1…an例已知先序序列為ABDGCEF,中序序列為·任何n(n>0)個(gè)不同結(jié)點(diǎn)的二叉樹(shù),都可由它的中序序列和后序序列唯一地確定。證明:后序序列是a1a2…an中序序列是b1b2…bn根結(jié)點(diǎn):an在中序序列中與an同的結(jié)點(diǎn)為:bj{b1…bj-1}bj{bj+1…bn}←→a1a2…ak}{ak+1…an-1}an例后序序列為GDBEFCA,中序序列為DGBAECF6.5樹(shù)與等價(jià)問(wèn)題離散數(shù)學(xué)中的定義等價(jià)關(guān)系:若集合S中的關(guān)系R是自反的、對(duì)稱的和傳遞的,則稱為等價(jià)關(guān)系等價(jià)類:R是集合S的等價(jià)關(guān)系,由[x]R={y|y∈S∧y給出的集合[x]R稱為由x生成的一個(gè)R等價(jià)類。劃分:R是S上的等價(jià)關(guān)系,可以按R將S劃分為若干不相交的子集……,它們的并即為S,則這些子集Si是S的R等價(jià)類。如何劃分等價(jià)類假設(shè)集合S有n個(gè)元素,m個(gè)形如(x,y)的等價(jià)偶對(duì)確定了等價(jià)關(guān)系R,求S的劃分。一種算法:1)令S中每個(gè)元素各自形成一個(gè)只含單個(gè)成員的子集,記為…,Sn2)重復(fù)讀入m個(gè)偶對(duì),對(duì)每個(gè)偶對(duì)(x,y),判斷x和y所屬的子集,設(shè)x∈S,y∈S,若SiS,則將Sj入Si并置Sj空。處理完m個(gè)偶對(duì)后剩下的非空子集就是S的R等價(jià)類。劃分等價(jià)類需要的操作:1)構(gòu)造只含單個(gè)元素的集合2)判定某個(gè)元素所屬集合3)合并兩個(gè)互不相交的集合FSt若S是FSe類型的集合,則它由子集Si構(gòu)成,∪…S=S?;静僮鳎海桑睿椋簦椋幔欤ǎΓ?,n,x1,x…,xn):構(gòu)造由n個(gè)子集構(gòu)成的集合S,每個(gè)子集只含單個(gè)元素。Find(S,x):查找x所屬的子集Siee&S,i,j):合并兩個(gè)不相交的集合SiSje類型的實(shí)現(xiàn)根據(jù)Find和Merge兩個(gè)操作的特點(diǎn),用樹(shù)來(lái)實(shí)現(xiàn)Set以森林F=(…,Tn)表示Se類型的集合S,每顆樹(shù)Ti示一個(gè)子集Si樹(shù)樹(shù)中每個(gè)結(jié)點(diǎn)表示子集中的一個(gè)成員x令每個(gè)結(jié)點(diǎn)中包含一個(gè)指向其雙親的指針約定根結(jié)點(diǎn)兼作子集的名稱集合的合并將一棵樹(shù)的根指向另一顆樹(shù)的根#defineMAXTREESIZE100typedefstructPTNode{TElem }PTNode;Typedefstruct{PTNodenodes[MAXTREESIZE];intr,n; //根的位置和結(jié)點(diǎn)數(shù)}TypedefPTreeStintfindmfset(MFSetS,int{if(i<1||i>S.n)return-for(j=i;S.nodes[j].parent>0;j=S.node[j].parent) returnj;}Statusmergemfset(MFSetSinti,int{if(i<1||i>S.n||j<1||j>S.n)returnERROR;S.node[i].parent=j;return}間復(fù)間復(fù)雜度分別為O(d)和O(1),d為樹(shù)的深(7)掌握線索二叉樹(shù)的概念和相關(guān)算法的實(shí)現(xiàn)(8)掌握哈夫曼樹(shù)的定義、哈夫曼樹(shù)的構(gòu)造過(guò)程和哈夫曼編碼產(chǎn)生方法(9)靈活運(yùn)用二叉樹(shù)這種數(shù)據(jù)結(jié)構(gòu)解決一些綜合應(yīng)用問(wèn)題二、真題舉1.已知一棵二叉樹(shù)的前序遍歷結(jié)果為ABCDEF,中序遍歷結(jié)果為CBAEDF,則后序遍歷的結(jié)果 )【浙江大學(xué)A. B. C. D.不2.已知某二叉樹(shù)的后序遍歷序列是dabec,中序遍歷序列是debac,它的前序遍歷是( 大學(xué)】A. B. C. D.3.一棵左子樹(shù)為空的二叉樹(shù)在先序線索化后,其中空的鏈域的個(gè)數(shù)是( )【合肥工業(yè)大學(xué)】A.不確定 B.0 C.1 D.24.若X是二叉中序線索樹(shù)中一個(gè)有左孩子的結(jié)點(diǎn),且X不為根,則X的前驅(qū)為( )【南京理工大學(xué)】A.X的雙 B.X的右子樹(shù)中最左的結(jié)C.X的左子樹(shù)中最右結(jié) D.X的左子樹(shù)中最右葉節(jié)5.設(shè)F是一個(gè)森林,B是由F變換得的二叉樹(shù)。若F中有n個(gè)非終端結(jié)點(diǎn),則B中右指針域?yàn)榭盏慕Y(jié)點(diǎn)有( )個(gè)?!疚靼搽娮涌萍即髮W(xué)】A.n- B. C.n+ D.n+三、本講小線索二叉樹(shù)的概念和相關(guān)算法的實(shí)現(xiàn)。樹(shù)、森林與二叉樹(shù)的關(guān)系樹(shù)的簡(jiǎn)單應(yīng)第3~、考點(diǎn)講極端情況進(jìn)進(jìn)方法Merge時(shí),總是將成員少的子集根結(jié)點(diǎn)指向含成員多的子集的修改存儲(chǔ)結(jié)構(gòu),令根結(jié)點(diǎn)的parent域存儲(chǔ)子集中所含成員數(shù)目的負(fù)可以將findmfset的復(fù)雜度降到O(logn)Statusmixmfset(eSinti,intj){if(i<1||i>S.n||j<1||j>S.n)returnERROR;if(S.nodes[i].parent>S.nodes[j].parent){S.nodes[j].parent+=S.nodes[i].parent;S.nodes[i].parent=j;}S.nodes[i].parent+=S.nodes[j].parent;S.nodes[j].parent=i;}return}進(jìn)一步的改進(jìn):Find時(shí)壓縮路當(dāng)所查元素不在第二層時(shí),將所有從根到該元素路徑上的元素都變成根結(jié)點(diǎn)的孩子intfixmfset(MFSetSinti){if(i<1||i>S.n)return-for(j=i;S.nodes[j].parent>0;j=S.node[j].parent) for(k=i;k! =j;k=t){t=S.nodes[k]. S.nodes[k].parent=}return}6.6 哈夫曼樹(shù)及其應(yīng)用1.哈夫曼樹(shù)①路徑長(zhǎng)從樹(shù)中一個(gè)結(jié)點(diǎn)到另一個(gè)結(jié)點(diǎn)之間的分支構(gòu)成這兩個(gè)結(jié)點(diǎn)之間的路徑,路徑上的分支數(shù)目稱做路徑長(zhǎng)度。②樹(shù)的路徑長(zhǎng)從樹(shù)根到每一結(jié)點(diǎn)的路徑長(zhǎng)度之和③③結(jié)權(quán)和帶權(quán)路徑長(zhǎng)給樹(shù)的每個(gè)結(jié)點(diǎn)賦予一個(gè)具有某種實(shí)際意義的實(shí)數(shù),我們稱該實(shí)數(shù)為這個(gè)結(jié)點(diǎn)的權(quán)。在樹(shù)形構(gòu)中,我們把從樹(shù)根到某一結(jié)點(diǎn)的路徑長(zhǎng)度與該結(jié)點(diǎn)的權(quán)的乘積,叫做該結(jié)點(diǎn)的帶權(quán)路徑長(zhǎng)度④樹(shù)的帶權(quán)路徑長(zhǎng)度WPL(WeightPathLengthofTree)樹(shù)中所有葉子結(jié)點(diǎn)的帶權(quán)路徑長(zhǎng)度之和,通常記為:WPL=

wnknLa)=7×2+5×2+2×2+4×2=36Lb)=4×2+7×3+5×3+2×1=46Lc)=7×1+5×2+2×3+4×3=35⑤哈夫曼樹(shù)(最優(yōu)二叉樹(shù)設(shè)二叉樹(shù)具有n個(gè)帶權(quán)值的葉子結(jié)點(diǎn),那么從根結(jié)點(diǎn)到各個(gè)葉子結(jié)點(diǎn)的路徑長(zhǎng)度與相應(yīng)結(jié)點(diǎn)權(quán)值的乘積的和,叫做二叉樹(shù)的帶權(quán)路徑長(zhǎng)度。具有最小帶權(quán)路徑長(zhǎng)度的二叉樹(shù)稱為哈夫曼樹(shù)2.構(gòu)造哈夫曼樹(shù)(哈夫曼算法1)由給定的n個(gè)權(quán)值{...,Wn},構(gòu)造n棵只有一個(gè)葉子結(jié)點(diǎn)的二叉樹(shù),從而得到一個(gè)二2)在F中選取根結(jié)點(diǎn)的權(quán)值最小和次小的兩棵二叉樹(shù)作為左、右子樹(shù)構(gòu)造一棵新的二叉樹(shù),這新的二叉樹(shù)根結(jié)點(diǎn)的權(quán)值為其左、右子樹(shù)根結(jié)點(diǎn)權(quán)值之和3)3)在集合F中刪除作為左、右子樹(shù)新加入到集合F中兩棵二叉樹(shù),并建立的二叉4)重復(fù)(2)、(3)兩步,當(dāng)F

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論