1. 程式人生 > >資料結構——第三章樹和二叉樹:03樹和森林

資料結構——第三章樹和二叉樹: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

)對應得到Node(root);由(t11, t12, ... , t1m)對應得到LBT;由(T2, T3, ... , Tn)對應得到RBT。

(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.