日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

01数据结构概述(郝斌数据结构)

發(fā)布時(shí)間:2023/12/31 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 01数据结构概述(郝斌数据结构) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

數(shù)據(jù)結(jié)構(gòu)概述(教材選用嚴(yán)蔚敏、吳偉民,該書程序是偽算法具體的程序是高一凡,西電的,大牛,只有程序。還有一本書,臺(tái)灣的黃國瑜自己寫的只有思路,程序是另外一個(gè)合作的清華的寫
的,可惜很多錯(cuò)的。)
學(xué)完數(shù)據(jù)結(jié)構(gòu)之后會(huì)對(duì)面向過程的函數(shù)有一個(gè)更深的了解
????
?? 定義
?????? 我們?nèi)绾伟熏F(xiàn)實(shí)中大量而復(fù)雜的問題以特定的數(shù)據(jù)類型(單個(gè)數(shù)據(jù)怎樣存儲(chǔ)?)和特定的存儲(chǔ)結(jié)構(gòu)(個(gè)體的關(guān)系)保存到主存儲(chǔ)器(內(nèi)存)中,以及在此基礎(chǔ)上為實(shí)現(xiàn)某個(gè)功能
?????? (比如查找某個(gè)元素,刪除某個(gè)元素,對(duì)所有元素進(jìn)行排序)而執(zhí)行的相應(yīng)操作,這個(gè)相應(yīng)的操作也叫算法。(比如班里有15個(gè)人,其信息量也許一個(gè)數(shù)組就搞定了,但是假如10000個(gè),
?????? 怎么辦?內(nèi)存也許沒有這么多連續(xù)的空間,所以我們改用鏈表,you see這就是與存儲(chǔ)有關(guān)系。又比如,人事管理系統(tǒng)的信息存儲(chǔ),因?yàn)榇嬖谥舷录?jí)的關(guān)系,所以數(shù)組和鏈表就無能為力了,
?????? 這時(shí)候我們用樹,再比如我們做的是交通圖,站和站之間肯定要連通,這時(shí)候以上的存儲(chǔ)方式又無能為力了,所以我們又有了圖。圖就是每個(gè)結(jié)點(diǎn)都可以和其他結(jié)點(diǎn)產(chǎn)生聯(lián)系。所以當(dāng)我們要解決
?????? 問題時(shí),首先要解決的是如何把這些問題轉(zhuǎn)換成數(shù)據(jù),先保存到我們的主存中,)
??????
?????? 數(shù)據(jù)結(jié)構(gòu) = 個(gè)體 + 個(gè)體的關(guān)系
?????? 算法 = 對(duì)存儲(chǔ)數(shù)據(jù)的操作
?? 算法
?? ??解題的方法和步驟
?? ??
?? ??衡量算法的標(biāo)準(zhǔn)
?? ???1、時(shí)間復(fù)雜度:大概程序要執(zhí)行的次數(shù),而非執(zhí)行的時(shí)間。?
?? ???2、空間復(fù)雜度:算法執(zhí)行過程中大概所占用的最大內(nèi)存? ????
?? ???3、難易程度(主要是應(yīng)用方面看重)???
?? ???4、健壯性(不能別人給一個(gè)非法的輸入就掛掉)??
?? ?數(shù)據(jù)結(jié)構(gòu)的地位
?? ??數(shù)據(jù)結(jié)構(gòu)是軟件中最核心的課程
?? ??程序 = 數(shù)據(jù)的存儲(chǔ)+數(shù)據(jù)的操作+可以被計(jì)算機(jī)執(zhí)行的語言(已經(jīng)提供)?
(學(xué)完數(shù)據(jù)結(jié)構(gòu),想用一種語言去實(shí)現(xiàn)它,必須有指針,數(shù)據(jù)結(jié)構(gòu)java版,就胡扯,變味,因?yàn)槲覀円v鏈表,就是通過指針鏈在一起的。比如在java中A aa = new A();本質(zhì)上,aa是個(gè)地址)??
預(yù)備知識(shí)
??? 指針
??? ?指針的重要性:(內(nèi)存是可以被CPU直接訪問的,硬盤不行,主要靠地址總線,數(shù)據(jù)總線,控制總線。)
??? ??指針是C語言的靈魂
??? ?定義
??? ??地址:地址就是內(nèi)存單元的編號(hào),從0開始的非負(fù)整數(shù)
??? ????? 范圍:0--FFFFFFFF[0-4G-1](地址線是32位,剛好控制2的32次)
??? ??指針:
??? ???指針就是地址? 地址就是指針
??? ???指針變量是存放內(nèi)存單元地址的變量
??? ???指針的本質(zhì)是一個(gè)操作受限的非負(fù)整數(shù)(不能加乘除,只能減)
??? ?分類:
??? ???? 1、基本類型的指針
??? ???? 2、指針和數(shù)組的關(guān)系
???
??? 結(jié)構(gòu)體(C++中用類也能實(shí)現(xiàn))
??? ?為什么會(huì)出現(xiàn)結(jié)構(gòu)體:為了表示一些復(fù)雜的數(shù)據(jù),而普通的基本類型變量無法滿足要求
??? ?什么叫結(jié)構(gòu)體:結(jié)構(gòu)體是用戶根據(jù)實(shí)際需要自己定義的復(fù)合數(shù)據(jù)類型
??? ?如何使用結(jié)構(gòu)體
??? ??兩種方式:
??? ???struct Student st = {1000, "zhangsan", 20}
??? ???struct Student * pst = &st;
??? ???1.
??? ????st.sid
??? ???2.
??? ??? ?pst->sid
??? ??? ?pst所指向的結(jié)構(gòu)體變量中的sid這個(gè)成員
??? ?
??? ?注意事項(xiàng):
??? ??結(jié)構(gòu)體變量不能加減乘除,但可以相互賦值
??? ??普通結(jié)構(gòu)體變量和結(jié)構(gòu)體指針變量作為函數(shù)參數(shù)的傳遞
??? ??
?(病毒就是靠訪問正在運(yùn)行的那些程序所占用的內(nèi)存。Java中規(guī)定局部變量必須初始化,因?yàn)檫@些變量一開始都是垃圾值,但是屬性不是必須初始化的,因?yàn)橐呀?jīng)默認(rèn)初始化為0)??
??? 動(dòng)態(tài)內(nèi)存分配和釋放(動(dòng)態(tài)分配的內(nèi)存一定要手動(dòng)釋放,否則造成內(nèi)存泄露。)
(java中A aa = new A();其實(shí)就是 A *p = (A *)malloc(sizeof(A)))

模塊一:線性結(jié)構(gòu)【把所有的結(jié)點(diǎn)用一根直線穿起來】
?連續(xù)存儲(chǔ)【數(shù)組】
??1、什么叫做數(shù)組:元素類型相同,大小相等(數(shù)組傳參,只要傳進(jìn)去首地址和長度就行)
??2、數(shù)組的優(yōu)缺點(diǎn):
???優(yōu)點(diǎn):
????存取速度快
???缺點(diǎn):
????事先必須知道數(shù)組的長度
????插入刪除元素很慢
????空間通常是有限制的
????需要大塊連續(xù)的內(nèi)存塊
????插入刪除元素的效率很低

??? 離散存儲(chǔ)【鏈表】(我們搞底層的開發(fā),類似于SUN公司的類)
??? ?定義:
??? ??n個(gè)節(jié)點(diǎn)離散分配
??? ??彼此通過指針相連
??? ??每個(gè)節(jié)點(diǎn)只有一個(gè)前驅(qū)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)只有一個(gè)后續(xù)節(jié)點(diǎn)
??? ??首節(jié)點(diǎn)沒有前驅(qū)節(jié)點(diǎn),尾節(jié)點(diǎn)沒有后續(xù)節(jié)點(diǎn)。
??? ??
??? ??專業(yè)術(shù)語:
??? ????首節(jié)點(diǎn):第一個(gè)有效節(jié)點(diǎn)
??? ????尾節(jié)點(diǎn):最后一個(gè)有效節(jié)點(diǎn)
??? ????頭節(jié)點(diǎn):頭結(jié)點(diǎn)的數(shù)據(jù)類型和首節(jié)點(diǎn)的類型一樣沒有存放有效數(shù)據(jù),最最前面的,是在首節(jié)點(diǎn)之前的,主要是為了方便對(duì)鏈表的操作。
??? ????頭指針:(指向頭)
??? ??????指向頭節(jié)點(diǎn)的指針變量
??? ????尾指針:
??? ??????指向尾節(jié)點(diǎn)的指針
??? ??????
(頭結(jié)點(diǎn)有可能很大,占的內(nèi)存可能大,假設(shè)我想造一個(gè)函數(shù)輸出所有鏈表的值,那你如果不用頭指針類型做形參,那由于不同鏈表的頭節(jié)點(diǎn)不一樣大小,這樣就沒辦法找出形參)

??? ?確定一個(gè)鏈表需要幾個(gè)參數(shù):(或者說如果期望一個(gè)函數(shù)對(duì)鏈表進(jìn)行操作我們至少需要接收鏈表的那些信息???)
??? ??只需要一個(gè)參數(shù):頭指針,因?yàn)橥ㄟ^它我們可以推出鏈表的所有信息。
(鏈表的程序最好一定要自己敲出來)
??? ?分類:
??? ??單鏈表
??? ??雙鏈表:每一個(gè)節(jié)點(diǎn)有兩個(gè)指針域
??? ??循環(huán)鏈表:能通過任何一個(gè)節(jié)點(diǎn)找到其他所有的節(jié)點(diǎn)
??? ??非循環(huán)鏈表
?
(java中變成垃圾內(nèi)存則會(huì)自動(dòng)釋放,但是C和C++則不會(huì),所以要手動(dòng)釋放,否則會(huì)引起內(nèi)存泄露。delete等于free)??? ?
??? ?算法:
??? ??遍歷? 查找? 清空? 銷毀? 求長度? 排序? 刪除節(jié)點(diǎn)? 插入節(jié)點(diǎn)
算法:狹義的算法是與數(shù)據(jù)的存儲(chǔ)方式密切相關(guān)
????? 廣義的算法是與數(shù)據(jù)的存儲(chǔ)方式無關(guān)
????? 泛型:(給你一種假象,只不過牛人從內(nèi)部都弄好了)
????? ??? 利用某種技術(shù)達(dá)到的效果就是:不同的存儲(chǔ)方式,執(zhí)行的操作是一樣的

算法的真正學(xué)法:很多算法你根本解決不了!!!!!!因?yàn)楹芏喽紝儆跀?shù)學(xué)上的東西,所以我們把答案找出來,如果能看懂就行,但是大部分人又看不懂,分三步,按照流程,語句,
????試數(shù)。這個(gè)過程肯定會(huì)不斷地出錯(cuò),所以不斷出錯(cuò),不斷改錯(cuò),這樣反復(fù)敲很多次,才能有個(gè)提高。實(shí)在看不懂就先背會(huì)。????? ???? ??
??? ??
??? ?鏈表的優(yōu)缺點(diǎn):
??? ???優(yōu)點(diǎn):
??? ????空間沒有限制
??? ????插入刪除元素很快
??? ???缺點(diǎn):
??? ????存取速度很慢。
???
??? 線性結(jié)構(gòu)的兩種常見應(yīng)用之一?? 棧?? (存儲(chǔ)數(shù)據(jù)的結(jié)構(gòu))
??? ?定義:一種可以實(shí)現(xiàn)“先進(jìn)后出” 的存儲(chǔ)結(jié)構(gòu)
??? ??棧類似于箱子
??? ?
??? ?分類
??? ??靜態(tài)棧 (類似于用數(shù)組實(shí)現(xiàn))
??? ??動(dòng)態(tài)棧 (類似于用鏈表實(shí)現(xiàn))
??? ?
??? ?算法(往里放,從里取)
??? ??出棧
??? ??壓棧(參看Java中線程的例子,成產(chǎn)消費(fèi)的例子)
??? ?
??? ?應(yīng)用
??? ??函數(shù)調(diào)用
??? ??中斷
??? ??表達(dá)式求值(用兩個(gè)棧,一個(gè)存放數(shù)字,一個(gè)存放符號(hào))
??? ??內(nèi)存分配
??? ??緩沖處理
??? ??迷宮
??? ?
??? 線性結(jié)構(gòu)的兩種常見應(yīng)用之二?? 隊(duì)列
??? ?定義:
??? ??一種可是實(shí)現(xiàn)“先進(jìn)先出”的存儲(chǔ)結(jié)構(gòu)
??? ?分類:
??? ??鏈?zhǔn)疥?duì)列:用鏈表實(shí)現(xiàn)
??? ??
??? ??靜態(tài)隊(duì)列:用數(shù)組實(shí)現(xiàn)
??? ???靜態(tài)對(duì)流通常都必須是循環(huán)隊(duì)列,為了減少
??? ???內(nèi)存浪費(fèi)。
??? ???
??? ???循環(huán)隊(duì)列的講解:
??? ????1、 靜態(tài)隊(duì)列為什么必須是循環(huán)隊(duì)列
??? ????2、?循環(huán)隊(duì)列需要幾個(gè)參數(shù)來確定 及其含義
??? ?????需要2個(gè)參數(shù)來確定
??? ??????front
??? ??????
??? ??????rear
??? ??????? ???????? ?????
??? ?????
??? ????3、 循環(huán)隊(duì)列各個(gè)參數(shù)的含義
?
???????2個(gè)參數(shù)不同場合不同的含義????
??????????????? 建議初學(xué)者先記住,然后慢慢體會(huì)
???
????????????? 1)隊(duì)列初始化
??? ???????front和rear的值都是零
??? ?????? 2)隊(duì)列非空
??? ???????front代表隊(duì)列的第一個(gè)元素
??? ???????rear代表了最后一個(gè)有效元素的下一個(gè)元素
??? ?????? 3)隊(duì)列空
??? ???????front和rear的值相等,但是不一定是零
?? ????? 4、?循環(huán)隊(duì)列入隊(duì)偽算法講解
?? ??????? ?兩步完成:
?? ??????? ?1)將值存入r所代表的位置
?? ??????? ?2)將r后移,正確寫法是 rear = (rear+1)%數(shù)組長度
?? ??????? ?錯(cuò)誤寫法:rear=rear+1;
?? ??????? ?
??? ????5、 循環(huán)隊(duì)列出隊(duì)偽算法講解
??? ?????front = (front+1) % 數(shù)組長度
??? ????
??? ????6、 如何判斷循環(huán)隊(duì)列是否為空
??? ?????如果front與rear的值相等,
??? ?????則隊(duì)列一定為空
??? ????
??? ????7、 如何判斷循環(huán)隊(duì)列是否已滿
??? ?????預(yù)備知識(shí):
??? ??????front的值和rear的值沒有規(guī)律,
??? ??????即可以大,小,等。
??? ????
??? ?????兩種方式:
??? ??????1、多增加一個(gè)表標(biāo)識(shí)的參數(shù)
??? ??????2、少用一個(gè)隊(duì)列中的元素(才一個(gè),不影響的)
??? ??????通常使用第二種方法
??? ??????如果r和f的值緊挨著,則隊(duì)列已滿
??? ??????用C語言偽算法表示就是:
??? ???????if( (r+1)%數(shù)組長度 == f )
??? ????????已滿
??? ???????else
??? ????????不滿
??? ??
??隊(duì)列算法:
??? ??????入隊(duì)
??? ??????出隊(duì)
??? ????隊(duì)列的具體應(yīng)用:
??? ??????所有和事件有關(guān)的操作都有隊(duì)列的影子。
??? ??????(例如操作系統(tǒng)認(rèn)為先進(jìn)來的先處理)
???
??? 專題:遞歸【這對(duì)你的編碼能力是個(gè)質(zhì)的飛躍,如果你想成為一個(gè)很厲害的程序員,數(shù)據(jù)結(jié)構(gòu)是必須要掌握的,因?yàn)橛?jì)算機(jī)專業(yè)的本科生也達(dá)不到這水平!計(jì)算機(jī)特別適合用遞歸的思想來解決問題,但是我們?nèi)祟愑眠f歸的思想
??? 來考慮問題就會(huì)感到十分困擾,這也是很多學(xué)過遞歸的人一直都搞不明白的地方!那是不是遞歸可以隨便寫,當(dāng)然不是,有些同學(xué)一用遞歸程序就死翹翹了。遞歸的思想是軟件思想的基本思想之一,在樹和圖論上面,幾乎全是
??? 用遞歸來實(shí)現(xiàn)的,最簡單,像求階乘這種沒有明確執(zhí)行次數(shù)的問題,都是用遞歸來解決】
??? ?定義:
??? ??一個(gè)函數(shù)自己直接或間接調(diào)用自己(一個(gè)函數(shù)調(diào)用另外
??? ??一個(gè)函數(shù)和他調(diào)用自己是一模一樣的,都是那三步,
??? ??只不過在人看來有點(diǎn)詭異。)
??? ??
??? ?遞歸滿足的三個(gè)條件:
??? ??1、遞歸必須得有一個(gè)明確的終止條件
??? ??2、該函數(shù)處理的數(shù)據(jù)規(guī)模必須在遞減
??? ??3、這個(gè)轉(zhuǎn)化必須是可解的。
??? ?
??? ?循環(huán)和遞歸:
??? ???理論上循環(huán)能解決的,肯定可以轉(zhuǎn)化為遞歸,但是這個(gè)
??? ???過程是復(fù)雜的數(shù)學(xué)轉(zhuǎn)化過程,遞歸能解決不一定能轉(zhuǎn)化
??? ???為循環(huán),我們初學(xué)者只要把經(jīng)典的遞歸算法看懂就行,
??? ???至于有沒有能力運(yùn)用看個(gè)人。??
??? ???
??? ???遞歸:
??? ????易于理解
??? ????速度慢
??? ????存儲(chǔ)空間大
??? ???循環(huán)
??? ????不易于理解
??? ????速度快
??? ????存儲(chǔ)空間小
??? ???
??? ?舉例:???
???1.求階乘
???2.1+2+3+4+。。。+100的和
???3.漢諾塔
???【漢諾塔】這不是線性遞歸,這是非線性遞歸!
???n=1????? 1
???n=2????? 3
???n=3????? 7
???.........
???.........
???n=64???? 2的64次方減1【這是個(gè)天文數(shù)字,就算世界上最快的計(jì)算機(jī)
???也解決不了,漢諾塔的負(fù)責(zé)度是2的n次方減1】問題很復(fù)雜,但真正解決
???問題的編碼只有三句。
???4.走迷宮(CS的實(shí)現(xiàn))
???
???遞歸的運(yùn)用:
????樹和森林就是以遞歸的方式定義的
????樹和圖的很多算法都是以遞歸來實(shí)現(xiàn)的
????很多數(shù)學(xué)公式就是以遞歸的方式定義的
?????斐波拉契序列
??????1 2 3 5 8 13 21 34。。。
??????
為何數(shù)據(jù)結(jié)構(gòu)難學(xué):因?yàn)橛?jì)算機(jī)內(nèi)存是線性一維的,而我們要處理的數(shù)據(jù)都是比較復(fù)雜的,那么怎么把這么多復(fù)雜的數(shù)據(jù)保存在計(jì)算機(jī)中來保存本身就是一個(gè)難題,而計(jì)算機(jī)在保存線性結(jié)構(gòu)的時(shí)候比較好理解,尤其是數(shù)
組和鏈表只不過是連續(xù)和離散的問題,線性結(jié)構(gòu)是我們學(xué)習(xí)的重點(diǎn),因?yàn)榫€性算法比較成熟,無論C++還是Java中都有相關(guān)的工具例如Arraylist. Linkedlist,但是在Java中沒有樹和圖,因?yàn)榉蔷€性結(jié)構(gòu)太復(fù)雜了,他的
操作遠(yuǎn)遠(yuǎn)大于線性結(jié)構(gòu)的操作。即使SUN公司也沒造出來。?????
小復(fù)習(xí)一下:^_^
????邏輯結(jié)構(gòu):(就是在你大腦里面能產(chǎn)生的,不考慮在計(jì)算機(jī)中存儲(chǔ))
???????線性(用一根直線穿)
????????在計(jì)算機(jī)中存儲(chǔ)用:
????????數(shù)組
????????鏈表
????棧和隊(duì)列是一種特殊的線性結(jié)構(gòu),是具體應(yīng)用。
????(操作受限的線性結(jié)構(gòu),不受限的應(yīng)該是在任何地方可以增刪改查
????可以用數(shù)組和鏈表實(shí)現(xiàn)。只要把鏈表學(xué)會(huì),棧和隊(duì)列都能搞定,數(shù)
????組稍微復(fù)雜一些。)????
???????非線性:
????????樹
????????圖
????物理結(jié)構(gòu):?
????????數(shù)組
????????鏈表???
??????
? ?
模塊二:非線性結(jié)構(gòu)(現(xiàn)在人類還沒有造出一個(gè)容器,能把樹和圖都裝進(jìn)去的,因?yàn)樗麄兇_實(shí)是太復(fù)雜了)
(都要靠鏈表去實(shí)現(xiàn))
?樹
???樹定義
?????專業(yè)定義:
?????? 1、有且只有一個(gè)稱為根的節(jié)點(diǎn)
?????? 2、有若干個(gè)互不相交的子樹,這些子樹本身也是一棵樹
??????
?????通俗定義:
??????1、樹是由節(jié)點(diǎn)和邊組成
??????2、每個(gè)節(jié)點(diǎn)只有一個(gè)父節(jié)點(diǎn)但可以有多個(gè)子節(jié)點(diǎn)
??????3、但有一個(gè)節(jié)點(diǎn)例外,該節(jié)點(diǎn)沒有根節(jié)點(diǎn),此節(jié)點(diǎn)稱為根節(jié)點(diǎn)
????
?????專業(yè)術(shù)語
??????節(jié)點(diǎn)??? 父節(jié)點(diǎn)????? 子節(jié)點(diǎn)
??????子孫??? 堂兄弟?????
??????深度:
???????從根節(jié)點(diǎn)到最底層節(jié)點(diǎn)的層數(shù)稱之為深度
???????根節(jié)點(diǎn)是第一層
??????葉子節(jié)點(diǎn);(葉子就不能劈叉了)
???????沒有子節(jié)點(diǎn)的節(jié)點(diǎn)
??????非終端節(jié)點(diǎn):
???????實(shí)際就是非葉子節(jié)點(diǎn)。
??????根節(jié)點(diǎn)既可以是葉子也可以是非葉子節(jié)點(diǎn)
??????度:
???????子節(jié)點(diǎn)的個(gè)數(shù)稱為度。(一棵樹看最大的)???
???樹分類:
????一般樹
?????任意一個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn)的個(gè)數(shù)都不受限制
????二叉樹(有序樹)
?????任意一個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn)的個(gè)數(shù)最多兩個(gè),且子節(jié)點(diǎn)
?????的位置不可更改。
?????
?????分類:
??????一般二叉樹
??????滿二叉樹
???????在不增加樹的層數(shù)的前提下。無法再多
???????添加一個(gè)節(jié)點(diǎn)的二叉樹就是滿二叉樹。
??????完全二叉樹
???????如果只是刪除了滿二叉樹最底層最右邊的
???????連續(xù)若干個(gè)節(jié)點(diǎn),這樣形成的二叉樹就是
???????完全二叉樹。
??????
????森林
?????n個(gè)互不相交的樹的集合


一般的二叉樹要以數(shù)組的方式存儲(chǔ),要先轉(zhuǎn)化成完全二叉樹,因?yàn)槿绻阒淮嬗行Ч?jié)點(diǎn)(無論先序,中序,后序),則無法知道這個(gè)樹的組成方式是什么樣子的。
????
???樹的存儲(chǔ)(都是轉(zhuǎn)化成二叉樹來存儲(chǔ))
????二叉樹的存儲(chǔ)
?????連續(xù)存儲(chǔ)【完全二叉樹】
??????優(yōu)點(diǎn):
???????查找某個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn)和子節(jié)點(diǎn)(也包括判斷有咩有)速度很快
??????缺點(diǎn):
???????耗用內(nèi)存空間過大
?????
?????鏈?zhǔn)酱鎯?chǔ)
?????
????一般樹的存儲(chǔ)
?????雙親表示法
??????求父節(jié)點(diǎn)方便
?????孩子表示法
??????求子節(jié)點(diǎn)方便
?????雙親孩子表示法
??????求父節(jié)點(diǎn)和子節(jié)點(diǎn)都很方便
?????二叉樹表示法
??????把一個(gè)普通樹轉(zhuǎn)化成二叉樹來存儲(chǔ)
??????具體轉(zhuǎn)換方法:
???????設(shè)法保證任意一個(gè)節(jié)點(diǎn)的
????????左指針域指向它的第一個(gè)孩子
????????有指針域指向它的下一個(gè)兄弟
???????只要能滿足此條件,就可以把一個(gè)普通樹轉(zhuǎn)化成二叉樹
???????一個(gè)普通樹轉(zhuǎn)化成的二叉樹一定沒有右子樹
??????
????
????森林的存儲(chǔ)
??????? 先把森林轉(zhuǎn)化為二叉樹,再存儲(chǔ)二叉樹,具體方式為:根節(jié)點(diǎn)
??????? 之間可以當(dāng)成是兄弟來看待
????
???二叉樹操作
????遍歷
?????????????????????
????????????????????? 先序遍歷【先訪問根節(jié)點(diǎn)】
????????????????????? ??先訪問根節(jié)點(diǎn)
????????????????????? ??再先序訪問左子樹
????????????????????? ??再先序訪問右子樹
?????????????????????
????????????????????? 中序遍歷【中間訪問根節(jié)點(diǎn)】
????????????????????? ??中序遍歷左子樹
????????????????????? ??再訪問根節(jié)點(diǎn)
????????????????????? ??再中序遍歷右子樹
????????????????????? ??
????????????????????? 后序遍歷【最后訪問根節(jié)點(diǎn)】
????????????????????? ??先后序遍歷左子樹
????????????????????? ??再后序遍歷右子樹
????????????????????? ??再訪問根節(jié)點(diǎn)
?????????????????????
????????????????? 已知兩種遍歷序列求原始二叉樹
????????????????? ??通過先序和中序 或者 中序和后續(xù)我們可以
????????????????? ??還原出原始的二叉樹
????????????????? ??但是通過先序和后續(xù)是無法還原出原始的二叉樹的
????????????????? ??
????????????????? ??換種說法:
????????????????? ???只有通過先序和中序, 或通過中序和后序
????????????????? ???我們才可以唯一的確定一個(gè)二叉樹?????
?????
????應(yīng)用
?????樹是數(shù)據(jù)庫中數(shù)據(jù)組織的一種重要形式(例如圖書館
?????的圖書分類一層一層往下分。)
?????操作系統(tǒng)子父進(jìn)程的關(guān)系本身就是一棵樹
?????面向?qū)ο笳Z言中類的繼承關(guān)系本身就是一棵樹
?????赫夫曼樹(樹的一個(gè)特例)
?
?
?圖

模塊三:查找和排序
??折半查找

??排序:
????冒泡
????插入
????選擇
????快速排序
????歸并排序
??
??排序和查找的關(guān)系
???排序是查找的前提
???排序是重點(diǎn)
?????
????
Java中容器和數(shù)據(jù)結(jié)構(gòu)相關(guān)知識(shí)
?Iterator接口
?Map
??哈希表(與Java關(guān)系比較大)
??
再次討論什么是數(shù)據(jù)結(jié)構(gòu):
?數(shù)據(jù)結(jié)構(gòu)研究是數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)和數(shù)據(jù)的操作的一門學(xué)問
?數(shù)據(jù)的存儲(chǔ)分為兩部分:
????個(gè)體的存儲(chǔ)
????個(gè)體關(guān)系的存儲(chǔ)
????從某個(gè)角度而言,數(shù)據(jù)的存儲(chǔ)最核心的就是個(gè)體關(guān)系
????的存儲(chǔ),個(gè)體的存儲(chǔ)可以忽略不計(jì)。

再次討論到底什么是泛型:
?同一種邏輯結(jié)構(gòu),無論該邏輯結(jié)構(gòu)物理存儲(chǔ)是什么樣子的
?我們都可以對(duì)它執(zhí)行相同的操作(例如都是線性結(jié)構(gòu)或者
?用數(shù)組實(shí)現(xiàn)的樹和用鏈表實(shí)現(xiàn)的樹。利用重載技術(shù)。)?

總結(jié)

以上是生活随笔為你收集整理的01数据结构概述(郝斌数据结构)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。