1、樹轉換為二叉樹
由於二叉樹是有序的,為了避免混淆,對於無序樹,我們約定樹中的每個結點的孩子結點按從左到右的順序進行編號。
將樹轉換成二叉樹的步驟是:
(1)加線,圖例紅色。就是在所有兄弟結點之間(同一層同一雙親結點的結點間)加一條連線;
(2)抹線。就是對樹中的每個結點,只保留他與第一個孩子結點之間的連線,刪除它與其它孩子結點之間的連線;
(3)旋轉。就是以樹的根結點為軸心,將整棵樹順時針旋轉一定角度,使之結構層次分明,紅色橫線連起來的結點作為最左結點的右孩子。


樹轉換為二叉樹的過程示意圖
2、森林轉換為二叉樹
森林是由若干棵樹組成,可以將森林中的每棵樹的根結點看作是兄弟,由於每棵樹都可以轉換為二叉樹,所以森林也可以轉換為二叉樹。
將森林轉換為二叉樹的步驟是:
(1)先把每棵樹轉換為二叉樹;
(2)第一棵二叉樹不動,從第二棵二叉樹開始,依次把后一棵二叉樹的根結點作為前一棵二叉樹的根結點的右孩子結點,用線連接起來。當所有的二叉樹連接起來后得到的二叉樹就是由森林轉換得到的二叉樹。



森林轉換為二叉樹的轉換過程示意圖
3、二叉樹轉換為樹、森林
二叉樹轉換為樹是樹轉換為二叉樹的逆過程,其步驟是:
(1)若某結點的左孩子結點存在,將左孩子結點的右孩子結點、右孩子結點的右孩子結點……都作為該結點的孩子結點,將該結點與這些右孩子結點用線連接起來;
(2)刪除原二叉樹中所有結點與其右孩子結點的連線;
(3)整理(1)和(2)兩步得到的樹,使之結構層次分明。


二叉樹轉換為樹的過程示意圖
二叉樹轉換為森林比較簡單,其步驟如下:
(1)先把每個結點與右孩子結點的連線刪除,得到分離的二叉樹;
(2)把分離后的每棵二叉樹轉換為樹;
(3)整理第(2)步得到的樹,使之規范,這樣得到森林。
判斷一棵二叉樹能夠轉換成一棵樹還是森林,標准很簡單,那就是只要看這棵二叉樹的根結點有沒有右孩子,有的話就是森林,沒有的話就是一棵樹。

結論:
根據樹與二叉樹的轉換關系以及二叉樹的遍歷定義可以推知:(樹只有先根遍歷和后根遍歷,沒有中根,因為定義的子樹未必是兩個,可能是三個,沒法左右,所以樹是沒有中根遍歷)
- 樹的先序遍歷與其轉換的相應的二叉樹的先序遍歷的結果序列相同;
- 樹的后序遍歷與其轉換的二叉樹的中序遍歷的結果序列相同;
- 樹的層序遍歷與其轉換的二叉樹的后序遍歷的結果序列相同。
由森林與二叉樹的轉換關系以及森林與二叉樹的遍歷定義可知:(森林只有先序遍歷和中序遍歷,沒有后序,有的教材雖然叫后序,實質還是先訪問第一棵樹的子森林,然后根,在除此之后下一森林,不管怎么稱呼,兩者含義是一樣的)
- 森林的先序遍歷和中序遍歷與所轉換得到的二叉樹的先序遍歷和中序遍歷的結果序列相同。
解決下森林沒有后序遍歷:注意在森林的遍歷中,把結點下面的一群孩子結點全看成左孩子結點了。
在這樣的上下文環境下,結點就無右孩子了,只有先序->根左,或者中序->左根,而后序->左根,所以就沒有后序了,這也是為什么有些教材也叫后序遍歷,如果是叫后序遍歷,等價於對應二叉樹的中序,也就是不管森林里叫它中序也好,后續也好,都等價於對應二叉樹的中序遍歷。

森林的遍歷有兩種方法:
(1)先序遍歷森林
-
- 訪問森林中第一棵樹的根結點;
- 先序遍歷森林中第一棵樹的根結點子樹組成的森林;
- 先序遍歷除去第一棵樹之外其余的樹組成的森林。
(2)中序遍歷森林
-
- 中序遍歷森林中第一棵樹的根結點的子樹組成的森林;(這里相當於把結點下面的孩子結點全看成左孩子結點了)
- 訪問第一棵樹的根結點;
- 中序遍歷除去第一棵樹之外其余的樹組成的森林。
假設:根據先序中序,比葫蘆畫瓢,推測(3)后序遍歷森林定義:
-
- 后序遍歷森林中第一棵樹的根結點的子樹組成的森林;
- 后序遍歷除去第一棵樹之外其余的樹組成的森林;
- 訪問第一棵樹的根結點。
按此得出的序列 B C D F J H I G E A
和對應二叉樹的后序序列 D C B F J H I G E A 不一樣。也沒有什么研究意義了。另,在對應二叉樹中B C D有順序層次,而在森林中BCD,全看成左孩子,它們遍歷的結果便不一樣了。

