資料結構——第三章樹和二叉樹:03樹和森林
1.樹的三種儲存結構:
(1)雙親表示法:
#define MAX_TREE_SIZE 100
結點結構:
typedef struct PTNode
{
Elem data;
int parent; //雙親位置域
} PTNode;
(2)孩子雙親連結串列表示法:
typedef struct PTNode
{
Elem data;
int parent; //雙親位置域
struct CTNode* nextchild;
} *ChildPtr;
(3)樹的二叉連結串列(孩子-兄弟)儲存表示法:
結點結構:
typedef struct CSNode
{
Elem data;
struct CSNode *firstchild, *nextsibling;
} CSNode, *CSTree;
2.森林和二叉樹的對應關係:
設森林:F = (T1, T2, ... , Tn); T1 = (root, t11, t12, ... , t1m);
二叉樹:B = (LBT, Node(root), RBT);
(1)由森林轉換成二叉樹的轉換規則為:若F = ∅,則B = ∅;否則,由ROOT(T1
(2)由二叉樹轉換為森林的轉換規則為:若B = ∅,則F = ∅;否則,由Node(root)對應得到ROOT(T1);由LBT對應得到(t11,t12, ... , t1m);由RBT對應得到(T2, T3, ... , Tn)。
(和樹對應的二叉樹,其左、右子樹的概念,已改變為左是孩子,右是兄弟)
3.樹轉換為二叉樹:將一棵樹轉換為二叉樹主要根據樹的孩子-兄弟儲存方式,方法是:
(1)樹中所有相鄰兄弟之間加一條連線;
(2)對樹中的每個結點,只保留其與第一個孩子結點之間的連線,刪去其與其它孩子結點之間的連線;
(3)以樹的根結點為軸心,將整棵樹順時針旋轉一定角度,使之結構層次分明
4.森林轉換為二叉樹:森林是若干棵樹的集合。樹可以轉換為二叉樹,森林同樣也可以轉換為二叉樹。因此,森林也可以方便地使用孩子-兄弟連結串列表示。森林轉換為二叉樹的方法如下:
(1)將森林中的每棵樹轉換成相應的二叉樹。
(2)第一棵二叉樹不動,從第二棵二叉樹開始,依次把後一棵二叉樹的根結點作為前一棵二叉樹根結點的右孩子,當所有二叉樹連在一起後,所得到的二叉樹就是由森林轉換得到的二叉樹。
5.二叉樹還原為樹或森林:樹和森林都可以轉換為二叉樹,二者的不同是:樹轉換成的二叉樹,其根結點必然無右孩子,而森林轉換後的二叉樹,其根結點有右孩子。將一棵二叉樹還原為樹或森林,具體方法如下:
(1)若某結點是其雙親的左孩子,則把該結點的右孩子、右孩子的右孩子...都與該結點的雙親結點用先線連起來。
(2)刪掉原二叉樹中所有雙親結點與右孩子結點的連線。
(3)整理由前兩步所得到的樹或森林,使之結構層次分明。
6.