20172326 《程序设计与数据结构》第六周学习总结
學(xué)號(hào) 20172326 《程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)》第六周學(xué)習(xí)總結(jié)
教材學(xué)習(xí)內(nèi)容總結(jié)
非線性數(shù)據(jù)結(jié)構(gòu)——樹
- 結(jié)點(diǎn):結(jié)點(diǎn)分為根節(jié)點(diǎn),內(nèi)部結(jié)點(diǎn)。根據(jù)結(jié)點(diǎn)分為parent和children,結(jié)點(diǎn)之上為parent,之下為children。位于同一結(jié)點(diǎn)的下的結(jié)點(diǎn)為sibling。
- order(度):每個(gè)結(jié)點(diǎn)所擁有的最大children數(shù),根據(jù)此定義,較為常見的二叉樹得以命名。
分類:1.平衡樹,所有葉子位于同一層或者至少彼此相差不超過(guò)一層。2.完全樹,在平衡的基礎(chǔ)上,底層所有葉子位于樹的左邊。3.滿樹,對(duì)于一個(gè)n元樹,每層葉子都是滿的,且均在同一層。
實(shí)現(xiàn)樹的方法。
- 1.使用鏈表。
- 因?yàn)闃涞臄?shù)據(jù)結(jié)構(gòu),每個(gè)結(jié)點(diǎn)指向其孩子,因此使用鏈表較為簡(jiǎn)單。
- 2.使用數(shù)組。
- 根據(jù)二叉樹的特殊性質(zhì),將左孩子存在數(shù)組(2 * n - 1 ) 索引值處,右孩子在(2 * n+1))處。但問(wèn)題在于,當(dāng)出現(xiàn)非滿樹的情況時(shí),數(shù)組中的某些位置就必須空下以表示某parent只有一個(gè)孩子,當(dāng)一個(gè)樹大量存在這種情況時(shí),將浪費(fèi)大量的空間。
模擬鏈接法。創(chuàng)建一個(gè)node型數(shù)組,使得每個(gè)元素存儲(chǔ)下一個(gè)children的地址。問(wèn)題,當(dāng)刪除一個(gè)結(jié)點(diǎn)時(shí),如果不保留原結(jié)點(diǎn)位置,子結(jié)點(diǎn)移動(dòng)時(shí)將會(huì)非常麻煩。如果只將其內(nèi)部元素刪除,保留內(nèi)部結(jié)點(diǎn)的引用關(guān)系,又會(huì)占用空間。
樹的遍歷
- 前序遍歷,中序遍歷,后序遍歷,層序遍歷
- 前序遍歷。從根節(jié)點(diǎn)開始,依次遍歷至葉子處的左孩子,再依次由下至上返回由孩子。直到將整個(gè)樹遍歷完成。
- 中序遍歷。從根結(jié)點(diǎn)開始。(注意,此時(shí)的從根節(jié)點(diǎn)開始并不是說(shuō)第一個(gè)也就是根節(jié)點(diǎn)開始,而是從根節(jié)點(diǎn)到最后一個(gè)最左葉結(jié)點(diǎn)方向)從最左葉節(jié)點(diǎn)開始,至其parent結(jié)點(diǎn),再至其右孩子。以此為規(guī)律,遍歷整個(gè)樹。
- 后序遍歷。和中序遍歷相同,從最左葉結(jié)點(diǎn)開始,然后至其兄弟結(jié)點(diǎn)。再至其parent結(jié)點(diǎn)。以此為規(guī)律,遞歸。
層序遍歷。顧名思義,一層一層的遍歷。從根節(jié)點(diǎn)開始。直到最后一層。
二叉樹
- 二叉樹。一個(gè)結(jié)點(diǎn)最多只有兩個(gè)孩子。
- 二叉查找樹。左孩子始終小于雙親,而雙親始終小于等于右孩子
- 二叉樹的性質(zhì)。
- 若根結(jié)點(diǎn)的層次為1,則二叉樹第i層最多有
2^(i-1)(i>=1)個(gè)結(jié)點(diǎn)。
- 若根結(jié)點(diǎn)的層次為1,則二叉樹第i層最多有
- 在高度為h的二叉樹中,最多有
個(gè)結(jié)點(diǎn)
教材學(xué)習(xí)中的問(wèn)題和解決過(guò)程
- 問(wèn)題1:對(duì)平衡二叉查找樹的理解探究
- 問(wèn)題1理解:
- 平衡樹的定義:它是一 棵空樹或它的左右兩個(gè)子樹的高度差的絕對(duì)值不超過(guò)1,并且左右兩個(gè)子樹都是一棵平衡二叉樹。從這定義就可以看出具有遞歸的思想。
- 為什么需要使用二叉樹?樹作為一種非線性結(jié)構(gòu),并不以線性方式存儲(chǔ)數(shù)據(jù),這樣一來(lái),尤其是對(duì)于查找效率,將大大提高(從O(n)到O(logn))。但當(dāng)出現(xiàn)一些極端例子時(shí),樹的優(yōu)勢(shì)將不復(fù)存在,如圖。
此時(shí)將一個(gè)順序列表存入其中,樹變?yōu)榱擞覇巫訕浠蜃髥巫訕洹?wèn)題出現(xiàn)了,此時(shí)的樹直接變成了列表,查找效率也從O(logn)變?yōu)镺(n)。為了解決這個(gè)問(wèn)題,我們引入了平衡樹的概念。如此,對(duì)于以無(wú)論何種順序存入樹的元素,不至于存的太深。在各個(gè)子樹最多只能相差一的限制下,樹的優(yōu)勢(shì)得以保留。
- 問(wèn)題2:本章內(nèi)容出現(xiàn)許多的迭代器與迭代器方法,對(duì)迭代器的探究。
- 問(wèn)題2理解:
- 首先明確迭代的意義是什么。迭代是重復(fù)反饋過(guò)程的活動(dòng),其目的通常是為了逼近所需目標(biāo)或結(jié)果。每一次對(duì)過(guò)程的重復(fù)稱為一次“迭代”,而每一次迭代得到的結(jié)果會(huì)作為下一次迭代的初始值。
- 從概念上來(lái)看,迭代似乎與遞歸十分相似,都有著重復(fù)的過(guò)程。那么區(qū)別在哪呢?遞歸,簡(jiǎn)單的來(lái)說(shuō),就是自己調(diào)用自己,直到到達(dá)限制條件。遞歸并不是這樣,遞歸通常有一個(gè)計(jì)數(shù)器,也就是通過(guò)循環(huán)不斷進(jìn)行計(jì)算,循環(huán)什么時(shí)候截止呢?在達(dá)到計(jì)數(shù)器時(shí),結(jié)束循環(huán)。通過(guò)之前的代碼可以知道,同一問(wèn)題,遞歸實(shí)現(xiàn)的代碼十分簡(jiǎn)潔可讀。但循環(huán)體則較為復(fù)雜,對(duì)于一個(gè)復(fù)雜問(wèn)題,短時(shí)間不易理解。但遞歸在帶來(lái)代碼簡(jiǎn)潔的同時(shí),執(zhí)行代碼時(shí)將占用大量?jī)?nèi)存,稍有不慎會(huì)使得棧溢出,拋出異常。迭代則不會(huì)這樣。
- 現(xiàn)在回到迭代器(Iterator)。內(nèi)部有三個(gè)方法。hasnext,next,remove通過(guò)重寫這三個(gè)方法,使得在不破壞內(nèi)部結(jié)構(gòu)的情況下,返回出內(nèi)部的數(shù)據(jù)。
代碼調(diào)試中的問(wèn)題和解決過(guò)程
- 問(wèn)題1:對(duì)于樹中removeSubtree的方法
- 問(wèn)題1解決方案:首先,明確要求,刪除某一個(gè)右子樹,直接將其設(shè)為null即可。問(wèn)題在于,如何找到對(duì)應(yīng)的右子樹。是根據(jù)對(duì)應(yīng)的那個(gè)元素判定還是對(duì)應(yīng)的結(jié)點(diǎn)?其實(shí)都可以,代碼如下:
分別鎖定了對(duì)應(yīng)的位置和結(jié)點(diǎn)。因此任意調(diào)用這兩個(gè)方法之一,即可找出相應(yīng)的右子樹。從而將其刪除。刪除時(shí),將對(duì)應(yīng)結(jié)點(diǎn)視為樹的根,直接將根所在的LinkedBinary樹等于null即可。
- 問(wèn)題2:在測(cè)試contain方法時(shí)出現(xiàn)了異常的問(wèn)題
- 問(wèn)題2解決方案:測(cè)試之前,還出現(xiàn)了一段小插曲。如圖,
顯示了報(bào)錯(cuò),同時(shí)無(wú)法執(zhí)行代碼。反復(fù)嘗試無(wú)果后,發(fā)現(xiàn)之前使用棧實(shí)現(xiàn)了一個(gè)Postfixtest,而本章也有一個(gè)使用數(shù)實(shí)現(xiàn)的計(jì)算后綴表達(dá)式的程序,在將其重名的改名后,重啟了幾次idea后,如愿恢復(fù)了正常。我的理解是,首先idea必須保證所有程序不出錯(cuò),否則其他程序編譯將無(wú)法通過(guò),同時(shí),對(duì)于兩個(gè)同名程序,無(wú)法判斷執(zhí)行哪個(gè),因此選擇不執(zhí)行,知道將其改變。
- 根據(jù)拋出異常顯示的位置,發(fā)現(xiàn)是removeSubRighttree出了問(wèn)題,
可是,拋出的是空指針異常,也就是并未找到所要?jiǎng)h除的結(jié)點(diǎn)。所以問(wèn)題不在這里。在于findnode方法,在方法體,我設(shè)置傳入了一個(gè)的LinkedBinary的參數(shù),但是,該樹此時(shí)為空,自然將導(dǎo)致其為空指針。
解決了這個(gè)問(wèn)題,再到contain方法,又出現(xiàn)了問(wèn)題。依舊為空,仔細(xì)比對(duì),發(fā)現(xiàn)了問(wèn)題。在方法頭,重新實(shí)例化了一個(gè)LinkedBinary對(duì)象,但是,其實(shí)樹已經(jīng)在之前方法確定,重新實(shí)例化反而相當(dāng)于將其清空,造成空指針的情況。
代碼托管
結(jié)對(duì)及互評(píng)
- 博客中值得學(xué)習(xí)的或問(wèn)題:
排版精美,對(duì)于問(wèn)題研究得很細(xì)致,解答也很周全。 - 代碼中值得學(xué)習(xí)的或問(wèn)題:
代碼寫的很規(guī)范,思路很清晰,繼續(xù)加油!
點(diǎn)評(píng)過(guò)的同學(xué)博客和代碼
- 本周結(jié)對(duì)學(xué)習(xí)情況
- 20172313
20172332
結(jié)對(duì)學(xué)習(xí)內(nèi)容
第十章 樹
其他(感悟、思考等,可選)
第一次學(xué)習(xí)非線性數(shù)據(jù)結(jié)構(gòu),對(duì)于某些知識(shí)還不是很了解,將繼續(xù)對(duì)這些展開學(xué)習(xí)
學(xué)習(xí)進(jìn)度條
代碼行數(shù)(新增/累積)博客量(新增/累積)學(xué)習(xí)時(shí)間(新增/累積)重要成長(zhǎng) 目標(biāo) 5000行 30篇 400小時(shí) 第一周 0/0 1/1 3/3 第二周 409/409 1/2 5/8 第三周 1174/1583 1/3 10/18 第四周 1843/3426 2/5 10/28 第五周 539/3965 2/7 20/48 第六周 965/4936 1/8 20/68
參考資料
- 二叉查找樹的刪除算法的設(shè)計(jì)與實(shí)現(xiàn)遞歸與非遞歸
- 圖解數(shù)據(jù)結(jié)構(gòu)二叉樹遍歷
轉(zhuǎn)載于:https://www.cnblogs.com/326477465-a/p/9853406.html
總結(jié)
以上是生活随笔為你收集整理的20172326 《程序设计与数据结构》第六周学习总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ChatGPT 迅速学会下棋精髓,把人类
- 下一篇: git相关操作记录