樹 森林與二叉樹的轉換

2021-09-28 16:42:38 字數 2473 閱讀 5944

樹、森林與二叉樹的轉換

1、樹轉換為二叉樹

由於二叉樹是有序的,為了避免混淆,對於無序樹,我們約定樹中的每個結點的孩子結點按從左到右的順序進行編號。

將樹轉換成二叉樹的步驟是:

(1)加線。就是在所有兄弟結點之間加一條連線;

(2)抹線。就是對樹中的每個結點,只保留他與第乙個孩子結點之間的連線,刪除它與其它孩子結點之間的連線;

(3)旋轉。就是以樹的根結點為軸心,將整棵樹順時針旋轉一定角度,使之結構層次分明。

樹轉換為二叉樹的過程示意圖

2、森林轉換為二叉樹

森林是由若干棵樹組成,可以將森林中的每棵樹的根結點看作是兄弟,由於每棵樹都可以轉換為二叉樹,所以森林也可以轉換為二叉樹。

將森林轉換為二叉樹的步驟是:

(1)先把每棵樹轉換為二叉樹;

(2)第一棵二叉樹不動,從第二棵二叉樹開始,依次把後一棵二叉樹的根結點作為前一棵二叉樹的根結點的右孩子結點,用線連線起來。當所有的二叉樹連線起來後得到的二叉樹就是由森林轉換得到的二叉樹。

森林轉換為二叉樹的轉換過程示意圖

3、二叉樹轉換為樹

二叉樹轉換為樹是樹轉換為二叉樹的逆過程,其步驟是:

(1)若某結點的左孩子結點存在,將左孩子結點的右孩子結點、右孩子結點的右孩子結點……都作為該結點的孩子結點,將該結點與這些右孩子結點用線連線起來;

(2)刪除原二叉樹中所有結點與其右孩子結點的連線;

(3)整理(1)和(2)兩步得到的樹,使之結構層次分明。

二叉樹轉換為樹的過程示意圖

4、二叉樹轉換為森林

二叉樹轉換為森林比較簡單,其步驟如下:

(1)先把每個結點與右孩子結點的連線刪除,得到分離的二叉樹;

(2)把分離後的每棵二叉樹轉換為樹;

(3)整理第(2)步得到的樹,使之規範,這樣得到森林。

根據樹與二叉樹的轉換關係以及二叉樹的遍歷定義可以推知,樹的先序遍歷與其轉換的相應的二叉樹的先序遍歷的結果序列相同;樹的後序遍歷與其轉換的二叉樹的中序遍歷的結果序列相同;樹的層序遍歷與其轉換的二叉樹的後序遍歷的結果序列相同。由森林與二叉樹的轉換關係以及森林與二叉樹的遍歷定義可知,森林的先序遍歷和中序遍歷與所轉換得到的二叉樹的先序遍歷和中序遍歷的結果序列相同。

6.6 哈夫曼樹

6.6.3哈夫曼樹的應用

1.哈夫曼編碼

通訊中,可以採用0,1的不同排列來表示不同的字元,稱為二進位制編碼。而哈夫曼樹在資料編碼中的應用,是資料的最小冗餘編碼問題,它是資料壓縮學的基礎。若每個字元出現的頻率相同,則可以採用等長的二進位制編碼,若頻率不同,則可以採用不等長的二進編碼,頻率較大的採用位數較少的編碼,頻率較小的字元採用位數較多的編碼,這樣可以使字元的整體編碼長度最小,這就是最小冗餘編碼的問題。 而哈夫曼編碼就是一種不等長的二進位制編碼,且哈夫曼樹是一種最優二叉樹,它的編碼也是一種最優編碼,在哈夫曼樹中,規定往左編碼為0,往右編碼為1,則得到葉子結點編碼為從根結點到葉子結點中所有路徑中0和1的順序排列。

例如,給定權,得到的哈夫曼樹及編碼見圖6-32 (假定權值就代表該字元名字)。

2.哈夫曼解碼

在通訊中,若將字元用哈夫曼編碼形式傳送出去,對方接收到編碼後,將編碼還原成字元的過程,稱為哈夫曼解碼。

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

也能惟一地對應到乙個森林或一棵樹。

1.樹、森林到二叉樹的轉換

(1)將樹轉換為二叉樹

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

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

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

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

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

(2)將乙個森林轉換為二叉樹

具體方法是:

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

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

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

具體轉換過程可

2.二叉樹到樹、森林的轉換

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

,最後去掉所有雙親到右孩子的連線。

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

具體轉換過程可

哈副慢演算法

for i:=1 to n do

f[i].data:=w[i];

f[i].l;=0;

f[i].r:=0;

type tree=record

begin

data:integer

l,r;tree;

a[i].data  排序暫存空間  data為各樹根節點的值

a【i】,add   a[i]zai f 中位址

樹 森林與二叉樹的轉換

1 加線。在所有兄弟節點之間加一條線。2 去線。對樹中每個節點,只保留它與第乙個孩子節點的連線,刪除它與其他孩子節點之間的連線。3 層次調整。以樹的根節點為軸心,將整顆樹順時針旋轉一定的角度,使之結構層次分明。注意第乙個孩子是二叉樹節點的左孩子,兄弟轉換過來的孩子是節點的右孩子。1 把每個樹轉換為二...

樹 森林與二叉樹的轉換

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

樹 森林與二叉樹的轉換

1 樹轉換為二叉樹 將樹轉換為二叉樹的步驟如下 1 加線。在所有兄弟結點之間加一條連線。2 去線。對樹中每個結點,只保留它與第乙個孩子結點的連線,刪除它與其他孩子結點之間的連線。3 層次調整。以樹的根結點為軸心,將整棵樹順時針旋轉一定的角度,使之結構層次分明。注意第乙個孩子是二叉樹結點的左孩子,兄弟...