一、樹的定義
ADT Tree{ 數據對象: D={1=<i<=n, n>=0, a(i)屬於 ElemType類型} 數據關係: R={<a(i), a(j)> | a(i), a(j)屬於 D, 1=<i<=n, 1=<j<=n, 其中每個元素只有一個前驅,可以有零個或多個後繼,有且僅有一個元素沒有前驅} 基本運算: InitTree(&t):初始化樹:構造一棵空樹 t。 ClearTree(&t):銷燬樹:釋放樹 t所佔胡空間。 Parent(t):求元素 t的前驅。 Sons(t):求元素 t的所有後繼。 }
二、樹的存儲結構
1、雙親存儲結構
這種存儲結構是一種順序存儲結構,用一組連續空間存儲樹的所有節點,
同時在每個節點中設置一個僞指針指示雙親節點的位置。 結構體類型定義:
typedef struct{ ElemType data; int parent; } PTree[MaxSize];
2、孩子存儲結構
這種存儲結構中,每個節點不僅包含數據,還包括指向所有孩子節點的指針。 按照樹的度設計節點的最大孩子節點個數。 結構體定義如下:
typedef struct node{ ElemType data; struct node* sons[MAX_SONS]; } TSonNode;
3、孩子兄弟鏈存儲結構
這個存儲結構爲每個節點設計三個域:一個數據元素域、一個指向當前節點第一個字節點的指針域、一個指向該節點下一個兄弟節點的指針域。 結構體類型定義:
typedef struct tnode{ ElemType data; struct tnode* first_son; struct tnode* next_brother; } TSBNode;
三、樹的基本運算
- 尋找某種滿足特定關係的節點,如尋找當前節點的雙親節點。
- 插入或刪除某個節點,如在樹的當前節點上插入一個新節點或刪除當前節點的第 i個孩子節點。
- 遍歷樹中的每個節點。
1、樹的遍歷
1、先根遍歷
(1)訪問根節點。
(2)按照從左到右的順序先根遍歷根節點的每一棵子樹。
2、後根遍歷
(1)按照從左到右的順序後根遍歷每一棵子樹。
(2)訪問根節點。