1.樹三種不同的表示法:
- 雙親表示法
- 孩子表示法
- 孩子兄弟表示法
雙親表示法
- 雙親表示法,就是以雙親作為索引的關鍵詞的一種存儲方式
- 我們假設以一組連續空間存儲樹的結點,同時在每個結點中,附設一個指示其雙親結點在數組中位置的元素
-
也就是說,每個結點除了知道自己是誰之外,還知道它的雙親在哪里
雙親表示法
定義:
// 樹的雙親表示法結點結構定義
#define MAX_TREE_SIZE 100
typedef int ElemType;
typedef struct PTNode
{
ElemType data; // 結點數據
int parent; // 雙親位置(下標)
}PTNode;
typedef struct
{
PTNode nodes[MAX_TREE_SIZE];
int r; // 根的位置(下標)
int n; // 結點數目
}PTree;
雙親表示法這樣的存儲結構,我們可以根據某結點的parent指針找到它的雙親結點,所用的時間復雜度為O(1),索引到parent位-1時,表示找到了樹結點的根
缺點:
如果我們要知道某結點的孩子是什么,只能遍歷整個樹結構
那我們對這個結構做如下改進,每個結點添加孩子的下標:
雙親表示法-孩子
如果我們又比較關心它們兄弟之間的關系呢?那么結構可以改為這樣
雙親表示法-兄弟
孩子表示法
由于樹中每個結點可能有多棵子樹,可以考慮用多重鏈表來實現,這就有了如下的表示法:
樹
孩子表示法
如圖所示,每個結點除了存儲自身的值與索引外,還增加了一個指針,指向子樹的左子樹,左子樹依次指向右子樹,這樣,不管是孩子還是兄弟的查找都變得很容易了
雙親孩子表示法
在孩子表示法中,只找到孩子還不夠完善,我們合并之前的雙親表示法,就得到了雙親孩子表示法:
雙親孩子表示法