資料結構 - 樹 - 一般樹和森林的基本介紹
阿新 • • 發佈:2022-05-17
樹的儲存結構
雙親表示法
通過儲存樹中每個結點的雙親結點的位置,來表示樹中結點之間的結構關係。
#define MAX_TREE_SIZE 100
typedef struct PTNode
{
ElemType data;
int parent; // 雙親位置(雙親的下標)
} PTNode;
typedef struct
{
PTNode nodes[MAX_TREE_SIZE];
int r, n; // r為根的位置,n為結點數
} Ptree;
孩子表示法
通過儲存樹中每個結點的孩子結點的位置,表示樹中結點之間的結構關係。
方法一:多重連結串列
類似於二叉連結串列,我們可以用多叉連結串列。具體實現有兩種方式:定長結點和不定長結點。
- 定長結點:優點是結點結構一致,便於實現樹的操作,缺點是浪費一些記憶體空間。
- 不定長結點:優點是節省記憶體空間,缺點是不定長的結點會使一些操作實現變複雜。
方法二:孩子連結串列
將樹中的每個結點的孩子排列起來,看成一個線性表,採用線性連結串列進行儲存。
樹的孩子連結串列的型別定義如下:
typedef struct CTNode // 孩子結點 { int child; struct CTNode* next; } *ChildPtr; typedef struct { ElemType data; ChildPtr firstchild; // 孩子連結串列頭指標 } CTBox; typedef struct { CTBox nodes[MAX_TREE_SIZE]; int n, r; // 結點數和根的位置 } CTree;
孩子兄弟表示法
我們也可以仍用二叉連結串列作為樹的儲存結構。
樹的孩子兄弟表示法的型別定義如下:
typedef struct CSNode
{
ElemType data;
struct CSNode
* firstchild, //指向第一個孩子
* nextsibling; //指向下一個兄弟
} CSNode, * CSTree;
樹與二叉樹
樹與二叉樹的轉換
二叉樹和樹都可以用二叉連結串列儲存,我們可以以二叉連結串列為中介,實現樹與二叉樹之間的轉換。其轉換的方法圖示如下:
森林與二叉樹的轉換
森林:樹的集合。
將森林中的樹的根結點看作兄弟,用樹與二叉樹的轉換方法,進行森林與二叉樹的轉換。
樹的遍歷
遍歷:按一定規律走遍樹的各個頂點,且使每一頂點僅被訪問一次,即找一個完整而有規律的走法,以得到樹中所有結點的一個線性序列。
常用方法如下:
-
先根(序)遍歷:先訪問樹的根結點,然後依次先根遍歷根的每棵子樹。
-
後根(序)遍歷:先依次後根遍歷每棵子樹,然後訪問根結點。
-
層次遍歷:先訪問第一層上的結點,然後依次遍歷第二層,一直到最後一層的結點。