樹
樹 是n(n>=0)個結點的有限集。當n=0時成爲空樹。在任意一顆非空樹中:
有且僅有一個特定的稱爲根的結點;
當n>1時,其餘結點可分爲m(m>0)個互不相交的有限集T1、T2、.....Tm,其中每一個集合本身又是一顆樹,並且稱爲根的子樹
n>0時,根節點是唯一的,堅決不可能存在多個根結點
m>0 時,子樹的個數是沒有限制的,但它們互相是一定不會相交的。
結點擁有的子樹稱爲結點的度(Degree),樹的度取樹內各結點的度的最大值。
度爲0的結點稱爲葉結點(Leaf)或終端結點;
度不爲0的結點稱爲分支結點或非終端結點,除根結點外,分支結點也稱爲內部結點
樹的存儲結構
雙親表示法
以雙親作爲索引的關鍵詞
以一組連續空間存儲樹的結點,同時在每個結點中,附設一個指示雙親結點在數組中位置的元素
#define MAX_TREE_SIZE 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時,表示找到了樹結點的根。
但是要知道某結點的子節點,只能遍歷整個樹結構。
雙親孩子表示法
#define MAX_TREE_SIZE 100 typedef char ElemType; // 孩子結點 typedef struct CTNode { int child; //孩子結點的下標 struct CTNode *next ; //指向下一個孩子結點的指針 } *ChildPtr; //表頭結構 typedef struct { ElemType data; // 存放在樹中的結點的數據 int parent; // 存放雙親的下標 ChildPtr firstchild; // 指向第一個孩子的指針 }CTBox; //樹結構 typedef struct { CTBox nodes[MAX_TREE_SIZE]; //結點數組 int r ,n; }