樹
一對多的樹型結構,有且只有一個特定的根結點。
結點的度:結點擁有子樹的數量{
度為0:葉子結點/終端結點。
度不為0:非終端結點/分支結點(除去根結點其它稱為內部結點)。}
樹的度:樹中所有結點的度數的最大值。
樹的層次:根為第一層,以此類推。
結點的深度:根結點開始,自頂向下累加。
結點的高度:葉結點開始,自底向上累加。
樹的高度(深度):樹中結點的最大層數。
結點關系:
祖先結點:根結點到該點的唯一路徑上的任意結點。
子孫結點
雙親結點:根結點到該點的唯一路徑上的最近結點。
孩子結點
兄弟結點:有相同雙親結點的結點。
樹中的數學關系:
1.樹中的結點數等於所有結點的度數加1。
2.度為m的樹中第i層上最多有mi-1個結點。
3.高度為h的m叉樹至多有(mn-1)/(m-1)個結點。
4.具有n個結點的m叉樹的最小高度為[logm(n(m-1)+1)]
樹的存儲結構
順序存儲結構
雙親表示法:用一組連續的存儲空間存儲樹的結點,同時在每個結點中,用一個變量存儲該結點雙親結點在數組中的位置。typedef char ElemType;
typedef struct TNode{ ElemType data; //結點數據 int parent; //該結點雙親在數組的下標 }TNode; //結點數據類型
#define MaxSize 100
typedef struct{
TNode nodes[MaxSize]; //結點數組
int n; //結點數量
}Tree; //樹的雙親表示結構
鏈式存儲結構
孩子表示法:把每個結點的孩子結點排列起來存儲成1個單鏈表,所以n個結點有n個鏈表;
葉子結點鏈表為空;
n個單鏈表的頭指針又存儲在一個順序表(數組)中。
孩子鏈表結點代碼:
typedef char ElemType; typedef struct CNode{ int child; //該孩子在表頭的數組下標 struct CNode *next;//指向該結點的下一個孩子結點 }CNode,*child //孩子結點數據類型
每個孩子鏈表的表頭結點(存在數組中):
typedef struct{ ElemType data; //結點數據域 child first child;//指向該結點的第一個孩子結點 }TNode; //孩子結點的數據類型
#define MaxSize 100 typedef struct{ TNode nodes[MaxSize];//結點數據域 int n; //樹中結點數量 }Tree; //樹的孩子表示結構
孩子兄弟表示法:存儲孩子結點和兄弟結點。
typedef char ElemType; typedef struct CSNode{ ElemType data; //該結點數據域 struct CSNode *firsrchild,*right;//指向該結點的第一個孩子結點和該結點的右兄弟結點 }CSNode //孩子兄弟結點數據類型