樹和森林的儲存

2021-05-12 10:42:41 字數 1069 閱讀 3659

一、樹的儲存方式

樹與二叉樹的不同之處在於,二叉樹規定了每個節點只有兩個或者兩個一下的孩子,並且兩個孩子之間有序,而樹則可以擁有多個孩子,但是各個孩子之間規定為無序。在儲存樹的時候有多種表示方法:

1.雙親表示法

樹上所有的節點以及附加資訊適用乙個陣列來儲存。而陣列每個元素除了儲存樹上節點所包含的資訊外還要儲存該節點的雙親在這個陣列中儲存位置的下標。這種儲存方式的好處在於,如果要查詢乙個節點的雙親,或者延乙個節點往上查詢根節點效能較好,但是如果要查詢某個節點的孩子節點那麼就需要遍歷整個陣列

2.孩子表示法

這種表示方法可以認為是雙親表示法的乙個逆過程,同樣的樹上所有的節點以及附加資訊依舊被存放於乙個陣列當中,但是這裡陣列當中每個元素除了儲存節點本身的資訊外還要儲存表示節點孩子的附加資訊。由於樹的本身特點其每個節點的孩子數目並不統一,因此這裡一般採用乙個鍊錶的方式來實現,這個鍊錶當中每個節點儲存的資訊依然是樹上該節點孩子節點在陣列當中的下標。這種儲存方式的優缺點很明顯,查詢孩子方便而查詢雙親需要遍歷整個陣列。

作為兩種方式的折中,可以在陣列每個元素的附加資訊當中即儲存雙親資訊也儲存孩子資訊,也就是將上面兩種方法合併起來使用,這種儲存方法稱為孩子-雙親表示法

3.孩子-兄弟表示法

這種表示方法採用了二叉鍊錶的形式,也就是說將樹轉換為一棵二叉樹。這裡使用的方法是,二叉鍊錶上每個節點上的兩個孩子不再是表示二叉樹上節點的左孩子和右孩子,而是將左指標指向的節點表示為樹上該節點的孩子右指標表示該節點的相鄰兄弟。採用這種方式我們可以知道轉換後的二叉樹的根節點的右指標一定為空。

二、森林的儲存方式

森林的儲存方式也是採用二叉鍊錶的形式。我們知道森林實際上是多棵樹結構的集合,而且在樹的孩子-兄弟表示法中表示每棵樹的根節點的右指標必然為空。因此我們採用這樣的方法,對於第n+1棵樹將其根節點掛到表示第n棵樹的根節點的節點的右指標上。

三、樹和森林的遍歷

樹的先根遍歷等價於對轉換後二叉樹的先序遍歷,樹的後根遍歷等價於對轉換後二叉樹的中序遍歷;森林的先/中/後序遍歷等價於對轉換後二叉樹的先/中/後序遍歷。

樹的儲存 森林的儲存

1.連續儲存 順序儲存 完全二叉樹 以陣列實現 優點 查詢某個節點的父節點和子節點 包括判斷有沒有子節點和父節點 缺點 耗用記憶體空間過大 2.鏈式儲存 優點 耗記憶體小 由於計算機的記憶體是線性的,而樹是非線性的。若在計算機裡只存樹的有效節點,便不能查詢某個節點的子節點和父節點 或者說整個樹的邏輯...

樹與森林的儲存 遍歷和樹與森林的轉換

樹的儲存結構 雙親表示法 孩子表示法 a 多重鍊錶 鍊錶中每個指標指向一棵子樹的根結點 b 把每個跟結點的孩子結點排列起來,看成乙個線性表,且以單鏈表做儲存結構.且n個頭指標也組成乙個線性表.孩子兄弟表示法 二叉樹表示法或二叉鍊錶表示法 以二叉鍊錶做樹的儲存結構,鍊錶中結點的兩個鏈域分別指向該結點的...

樹和森林的遍歷

樹的遍歷 設樹t如下圖所示,結點r是根,根的子樹從左到右依次為t1,t2,tk。1 樹t的前序遍歷定義 若樹t非空,則 訪問根結點r 依次前序遍歷根r的各子樹t1,t2,tk。2 樹的後序遍歷定義 若樹t非空,則 依次後序遍歷根t的各子樹tl,t2,tk 訪問根結點r。例 對下面的 a 圖中的樹進行...