學習記錄 mooc浙大資料結構第三 四講 樹

2021-10-09 21:46:08 字數 2425 閱讀 3797

(時隔乙個月咕咕咕博主終於更新了。。。。)

寫在讀前:部落格內**基本每句都含注釋,請參考注釋食用~

部落格內容包括課程框架梳理,要點總結,筆者個人總結的拓展內容,pta課後題解等等,多有理解不當或者概念錯誤請多多指出並加以包涵~

通過遞迴實現的二分查詢是分治演算法應用的乙個典型例子,分治演算法的思想是「樹」這一部分的基礎,在第一章習題集中也略有提及,不了解的同學可以先看一下這篇題解(點我點我點我)中分治演算法的部分,略窺一二。

二分查詢又被形象地稱為折半查詢,「折半」即為分治中「分」的過程。在乙個有序排列的線性結構中,每次查詢將當前的範圍一分為二,判斷在哪一範圍內,層層遞迴,最終找到目標。

**實現:

//在表l中查詢值為x的元素,返回其位置poisiton;

position binarysearch

(list l,elementtype x)

if(l-

>data[right]

==x)

return right;

else

return notfound;

}

不同於線性表中 「乙個結點挨乙個結點」 優先順序都一致的結構 ,樹中的結點擁有了乙個 「優先順序」 ,乙個結點可以連線多個結點,形成 「一對多」 的關係,對於乙個結點及其所連線的結點,這個結點稱為其所連線結點的 「父節點」 ,其所連線的結點稱為這個結點的 「子節點」。或大或小的樹都是由這種具有 「父子關係」 的結構組成。

如圖,a為的父節點,為a的子節點。

基本術語:

結點的度:該結點子樹的個數;

樹的度:所有結點中最大的度;

葉節點:度為0的結點

兄弟結點:若兩個點擁有同一父節點,則這兩個點互為兄弟結點。

根:所有點(不包括這個點本身)的「祖先結點」, 即最高端的 「父節點」。

祖先結點:如果乙個節點的父節點仍然有父節點,則「這個點的父節點的父節點」稱為此結點的祖先結點,同理,父節點的父節點的父節點也稱為此點的祖先結點;

子孫結點:乙個結點的子節點及其子節點的子節點及其… … … …都稱為該點的子孫結點(禁止套娃)。

結點的層數(深度):規定根節點在第一層,其他任意一結點的層數是其父節點的層數加1。

樹的深度:所有結點中最大的層數。

路徑:從a結點到b結點,所經過的所有結點構成a到b的路徑;

路徑長度:此條路徑上點的個數。

鍊錶:針對上述現象,我們在這裡再引入乙個概念——二叉樹:每個結點最多有兩個子節點的樹。

而對於任意一顆樹,我們都可以將他轉化為一顆二叉樹,在何欽銘老師的課程中,我們學到一種特殊的樹的結構表示方法——兒子兄弟表示法,即將每乙個結點的子節點都連成一串鍊錶,每個結點開兩個指標,乙個指向子節點鍊錶的頭節點,另乙個指向與自己相鄰的兄弟(因為當前結點也處於其父節點的子節點鍊錶中)。詳情如圖:

a具有兩個指標,乙個連線子節點鍊錶,乙個連線兄弟結點,因為a是根節點,所以a的第二個指標指向null;

b具有兩個指標,因為是葉節點,沒有子節點,所以第乙個指向null,第二個指向與其相鄰的兄弟節點c;

c的兩個指標,乙個指向子節點鍊錶(鍊錶中只有f),另乙個指向與其相鄰的兄弟節點d;

… … …

其他結點同理。

至此,我們原本具有1個、2個和4個指標的結點結構都可以化為具有兩個結點的結構了。

基於此種思想,我們便可以化一般為特殊,使得任意一顆樹都可以採用鍊錶的方式儲存,為了方便編寫程式,我們也一般在解決問題時就將一顆普通樹的化為一顆二叉樹。

基本單位:

typedef

struct node *ptrtonode;

struct node

;ptrtonode binary_tree;

陣列:

既然我們已經有了能將樹存入鍊錶中的方法,那麼能不能進一步簡化,僅僅使用陣列呢?

鍊錶與陣列的區別就在於指標的存在,我們只需要使用陣列模擬指標即可。建立儲存資料的data陣列,模擬左指標的陣列left與模擬右指標的陣列right,將子節點的下標存入對應的兩個陣列即可。

上文中提到,我們通過構造二叉樹避開了 「各結點指標數量不一致」 的問題,那麼是否有其他的方法,不用建立新結構,更為直接的儲存一顆樹呢?

我們知道,樹是一種特殊的圖,可以把樹看出是一種所有結點的入度都為1的,無環無權值的單向圖。

圖中的儲存結構在樹中同樣適用,尤其是鄰接表的表示方法,而作為對鄰接表進行了空間再優化的向前星,也同樣適用於儲存圖。

在上一章的學習記錄中有關於向前星的詳細講解,有興趣的讀者請移步此處。

更新於2020.9.30凌晨。

六度空間 MOOC浙大資料結構

include include include include define max 10001 using namespace std int matgra max max int visit max 根據變數動態建立一維陣列 int bfs int node,int n if tmpnode l...

MOOC 浙大資料結構 最大子列和問題

給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測試各種不同的演算法在各種資料情況下的表現。各組測試資料特點如下 資料1 與樣例等價,...

《資料結構與演算法》 浙大MOOC)第1章 概論

include include include clock t start,stop double duration define maxn 10 多項式最大項數,即多項式階數 1 define maxk 1e7 被測函式最大重複呼叫次數 doublef1 int n,double a,double...