樹 樹的轉換

2021-08-31 11:19:54 字數 2959 閱讀 4486

1. 樹的儲存結構

通常,樹的儲存結構有三種,雙親表示法、孩子表示法和孩子兄弟表示法。

(1)雙親表示法

雙親表示法是利用一組連續的儲存單元儲存樹的每個結點,並利用乙個指示器表示結點的雙親結點在樹中的位置。

樹的雙親表示法儲存表示描述如下:

#define maxsize 200

typedef struct pnode /* 雙親表示法的結點定義 */

pnode;

typedef struct

ptree;

圖 樹的雙親表示法

(2)孩子表示法

由於樹中每個結點可能有多個孩子,所以自然想到用多重鍊錶儲存樹。在這種多重鍊錶的每個結點中除了用於存放資料資訊的data域外,還有若干指標域,分別用於指向該結點的孩子結點。但是一棵樹中,不同結點的度數是不同的,那麼每個結點中到底需要多少個指標域呢?我們有如下二種方案:

① 定長結點

即樹中每個結點均按樹的度k來設定指標。n個結點的樹一共有n*k個指標域,而樹中只有n-1條邊,故樹中的空指標數目為kn-(n-1)=n(k-1)+1(k越大,浪費的空間越多)。

②不定長結點

即樹中每個結點按本結點的度來設定指標數,並在結點中增設乙個度數域degree指出該結點包含的指標數。各結點不等長,雖然節省了空間,但是給運算帶來不便。

孩子結點表示法的型別定義如下:

//以下的datatype和maxtreesize由使用者定義

typedef struct cnodecnode;

typedef structptnode;

typedef structctree;

ctree t; //t為孩子鍊錶表示

注意:當結點t.nodes[i]為葉子時,其孩子鍊錶為空,即t.nodes[i].firstchild=null。

(3)孩子兄弟表示法

孩子兄弟表示法,也成為樹的二叉鍊錶表示法。孩子兄弟表示法,採用鏈式儲存結構,鍊錶由乙個資料域和兩個指標域組成。其中,資料域存放結點的資料資訊,乙個指標域用來指示結點的第乙個孩子結點,另乙個指標域用來指示結點的下乙個兄弟結點。

圖 孩子兄弟表示法

樹的孩子兄弟表示法的型別定義如下:

/* 孩子兄弟表示法的型別定義 */

typedef struct csnode

csnode, *cstree;

2. 樹、森林的遍歷

(1)樹的遍歷

設樹t如下圖所示,結點r是根,根的子樹從左到右依次為t1,t2,…,tk。

(1)樹t的前序遍歷定義:

若樹t非空,則:

①訪問根結點r;

②依次前序遍歷根r的各子樹t1,t2,…,tk。

(2)樹的後序遍歷定義:

若樹t非空,則:

①依次後序遍歷根t的各子樹tl,t2,…,tk;

②訪問根結點r。

【例】對下面的(a)圖中的樹進行前序遍歷和後序遍歷,得到的前序序列和後序序列分別是abcde和bdcea。

圖 樹和對應的二叉樹

注意:① 前序遍歷一棵樹恰好等價於前序遍歷該樹對應的二叉樹

② 後序遍歷樹恰好等價於中序遍歷該樹對應的二叉樹。

(2)森林的遍歷

(1)前序遍歷森林

若森林非空,則:

①訪問森林中第一棵樹的根結點;

②前序遍歷第一棵樹中根結點的各子樹所構成的森林

③前序遍歷除第一棵樹外其它樹構成的森林。

(2)後序遍歷森林

若森林非空,則:

①後序遍歷森林中第一棵樹的根結點的各子樹所構成的森林;

②訪問第一棵樹的根結點;

③後序遍歷除第一棵樹外其它樹構成的森林。

注意:① 前序遍歷森林等同於前序遍歷該森林對應的二叉樹

② 後序遍歷森林等同於中序遍歷該森林對應的二叉樹

【例】對下面(a)圖中所示的森林進行前序遍歷和後序遍歷,則得到該森林的前序序列和後序序列分別為abcdeficjh和bdcaifjghe。而(b)圖所示二叉樹的前序序列和中序序列也分別為abcdeficjh和bdcaifjghe。

圖 森林和對應的二叉樹

③ 當用二叉鍊錶作樹和森林的儲存結構時,樹和森林的前序遍歷和後遍歷,可用二叉樹的前序遍歷和中序遍歷演算法來實現。

3. 樹、森林和二叉樹的轉換

樹或森林與二叉樹之間有乙個自然的一一對應關係。任何乙個森林或一棵樹可惟一地對應到一棵二叉樹;反之,任何一棵二叉樹也能惟一地對應到乙個森林或一棵樹。

(1)樹、森林到二叉樹的轉換

* 將樹轉換為二叉樹

樹中每個結點最多只有乙個最左邊的孩子(長子)和乙個右鄰的兄弟。按照這種關係很自然地就能將樹轉換成相應的二叉樹:

①在所有兄弟結點之間加一連線;

②對每個結點,除了保留與其長子的連線外,去掉該結點與其它孩子的連線。

【例】下面(a)圖所示的樹可轉換為(c)圖所示的二叉樹。

圖 樹轉化為二叉樹

注意:由於樹根沒有兄弟,故樹轉化為二叉樹後,二叉樹的根結點的右子樹必為空。

* 將乙個森林轉換為二叉樹

具體方法是:

① 將森林中的每棵樹變為二叉樹

② 因為轉換所得的二叉樹的根結點的右子樹均為空,故可將各二叉樹的根結點視為兄弟從左至右連在一起,就形成了一棵二叉樹。

【例】下圖中,左邊包含三棵樹的森林可轉換為右邊的二叉樹。

圖 森林轉化為二叉樹

(2)二叉樹到樹、森林的轉換

把二叉樹轉換到樹和森林自然的方式是:若結點x是雙親y的左孩子,則把x的右孩子,右孩子的右孩子,…,都與y用連接連起來,最後去掉所有雙親到右孩子的連線。

【例】下圖的森林就是由二叉樹轉換成的。 

圖 森林轉化為二叉樹

樹 森林 二叉樹的轉換

樹 森林與二叉樹的轉換 樹或森林與二叉樹之間有乙個自然的一一對應關係。任何乙個森林或一棵樹可惟一地對應到一棵二叉樹 反之,任何一棵二叉樹也能惟一地對應到乙個森林或一棵樹。1 樹 森林到二叉樹的轉換 1 將樹轉換為二叉樹 樹中每個結點最多只有乙個最左邊的孩子 長子 和乙個右鄰的兄弟。按照這種關係很自然...

樹 森林 二叉樹的轉換

樹變二叉樹 樹變二叉樹的規則 每個結點的左指標指向它的第乙個孩子結點。右指標指向它在樹中的相鄰兄弟結點。也即 左孩子右兄弟。根沒有兄弟,所以轉換以後的樹沒有右子樹。具體操作 二叉樹變樹 二叉樹變樹的規則 是樹變二叉樹的逆過程。問 二叉樹可以變成各種各樣的樹,為何這裡只是唯一一種樹形?這裡只是假設這個...

樹與二叉樹的轉換

樹和二叉樹不同,可以有0到n個孩子,所以實現起來很麻煩,但我們可以借助樹的孩子兄弟表示法把樹轉換成二叉樹。在孩子兄弟表示法中,某個結點的第乙個孩子結點的指標是二叉樹中其左孩子結點指標,右兄弟結點指標是二叉樹中右孩子結點指標。樹轉換為二叉樹過程 1 樹中所有相同雙親結點的兄弟結點之間加一條連線 2 對...