演算法與資料結構筆記三

2021-06-29 08:41:48 字數 2619 閱讀 7044

摘錄from 大話資料結構

1.樹

①樹的度

結點擁有的子樹數成為結點的度(degree).度為0的結點成為葉節點(leaf)或終端結點。

②樹的深度或高度

結點的層次level,從根節點開始,根為第一層,根的孩子為第二層。樹中最大層次稱為樹的深度

(depth)或高度,當前樹的深度為4.

③樹的儲存

樹儲存當然也可以用線性表或者鍊錶來儲存。由於要快速高效的定位結點的孩子結點或者雙親結點,所以每個node可能要多個指標指向父母,指向兄弟。具體內容不再表述,直接看常用的樹結構:

二叉樹:

最多有兩個孩子結點的樹是二叉樹,所以它有五種形態

空二叉樹

只有乙個根節點

根節點只有左子樹

根節點只有右子樹

根節點既有左子樹又有右子樹。

二叉樹又分為左斜樹,右斜樹(故名思意,就是樹往一邊偏),滿二叉樹(都有倆孩子,除了葉子結點),

完全二叉樹(對於一課具有n個結點的二叉樹按層次編號,若編號為i (1<= i <=n)的結點與同樣深度的滿二叉樹

中編號為i的結點在二叉樹中位置完全相同,則這顆二叉樹成為完全二叉樹)。滿二叉樹一定是一顆完全二叉樹,但

完全二叉樹不一定是滿的,完全的二叉樹編號時不能有空檔,從頭到尾可以少編號,但不能空檔編號。

二叉樹的性質當然和2有關,比如最多結點樹,樹的深度等,再次不在贅述。

二叉樹的儲存結構是怎樣的呢?

二叉樹當然也有線性結構標示和鍊錶結構儲存兩種方式,對於線性儲存結構,由於二叉樹的結構是固定的,所以完全用線性表既可以表示出二叉樹,這裡假設二叉樹是滿二叉樹,如果不是滿二叉樹,那麼就用特殊符號補齊唄,

所以如果碰到斜樹,那麼儲存空間會大大的浪費啊,這種儲存方式不可取!

那麼再來看鏈式儲存吧,

鏈式儲存可用二叉鍊錶來實現,中間資料域,左邊儲存指向左子樹的指標,右邊儲存指向右子樹的指標。如下:

④樹的遍歷方式

以二叉樹為例,共有四種遍歷方式:

前序遍歷

中序遍歷

後序遍歷

層序遍歷。

前序遍歷規則是若二叉樹為空,則空操作返回,否則先訪問根節點,然後前序遍歷左子樹,再

前序遍歷右子樹,如下,順序為:abdghceif

中序遍歷規則是若樹為空,則空操作返回,否則從根節點開始(注意並不是先訪問根節點),中序遍歷根節點的左子樹,然後是訪問根節點,最後中序遍歷右子樹,如下遍歷順序為:gdhbaeicf

後序遍歷規則是若樹為空,則空操作返回,否則從左到右先葉子後結點的方式遍歷訪問左右子樹,最後訪問根節點,如下順序為:ghdbiefca

層序遍歷就是一層一層的結點排序,比較簡單。

通過遍歷完的順序可以反推出樹結構嗎,比較難,那麼怎麼在記憶體中生成乙個二叉樹呢。我們可以把原始二叉樹拓展成擴充套件二叉樹,具體就是構造一顆滿二叉樹,空結點用#標示,這樣通過前序遍歷的序列,就能反推出樹結構了。

⑤二叉樹的遍歷演算法

主要實現是遞迴演算法

⑥線索二叉樹

對二叉樹以某種次序遍歷使其變成線索二叉樹的過程就是線索化。主要是原來的樹,每個結點有兩個指標,指向做孩子和有孩子,對於沒有孩子的結點,一定有指標為空,浪費空間,為了更好的利用空間,我們用指標域按照不同的遍歷次序規則儲存它的前驅或者後繼結點。對於乙個n個結點的二叉鍊錶,一共有2n個指標域,而n個結點二叉樹總有n-1條分支線路,也就是說,其實存在 2n-(n-1) = n+1個空指標域存在。

⑦樹,二叉樹,與森林的相互轉化

樹轉二叉樹

森林轉二叉樹:

二叉樹轉為樹:

其實就是樹轉為二叉樹相反的過程。

二叉樹轉為森林: 略。

赫夫曼樹。

樹的樹徑長度就是從樹根到每乙個結點的路徑長度之和。這個長度之和最小的二叉樹成為赫夫曼樹。

赫夫曼樹就是避免出現斜樹,斜樹查詢效率比較低。

赫夫曼編碼

資料結構與演算法(三)

變位詞是指兩個詞之間存在組成字母的 重新排列關係 如 heart和earth,python和typhon 為了簡單起見,假設參與判斷的兩個詞僅由小寫 字母構成,而且長度相等 詞1中的字元逐個在詞2中檢查是否存在,存在則標記防止重複檢查。如果每個字元都能找到,並且詞1詞2長度相同則是變位詞。否則不是。...

資料結構與演算法(三)

鍊錶由單向的鏈變成雙向鏈,使用這種資料結構,我們不再拘束於單鏈表的單向建立於遍歷等操作。在單鏈表中,有乙個資料域,還有乙個指標域,資料域用來儲存相關資料,而指標域負責鍊錶之間的 聯絡 在雙向鍊錶中,需要有兩個指標域,乙個負責向後連線,乙個負責向前連線。單鏈表的結構 struct list 雙向鍊錶的...

資料結構與演算法 筆記 資料結構與演算法筆記 棧

以前學習的時候都沒怎麼好好的做過筆記,總是東記一點,西寫一點,甚至都不做筆記,導致後面找的時候找不到,最後還是求助搜尋引擎浪費掉很多時間。好腦筋不如個爛筆頭呀。這次又重新學習python的資料結構及演算法 中國mooc上的公開課 就好好做個筆記吧。棧是一種只能在一端進行插入和刪除的線性資料結構。一般...