資料結構—樹形結構
樹的概念
由N(N>=0)個節點組成的集合。對N > 1的樹,有:
- 有一個特殊的結點,稱為根結點,根節點沒有前驅結點
- 除根結點外,其餘結點被分成M(M>0)個互不相交的集合T1、T2、 ……、Tm,其中每一個集合Ti(1<= i <= m)又是一棵結構與樹類似 的子樹。每棵子樹的根結點有且只有一個前驅,可以有0個或多個後繼
因此,樹是遞迴定義的。
結點:結點包括一個數據元素及若干指向其他子樹的分支(指標)
結點的度:結點擁有子樹的個數稱為該結點的度
葉結點:度為0的結點稱為葉結點,葉結點也稱為終端結點
分支結點:度不為0的結點稱為分支結點,分支結點也稱為非終端節點。一 棵樹中除葉節點外的所有節點都是分支結點
祖先結點:從根節點到該結點所經分支上的所有節點
子孫結點:以某節點為根節點的子樹中所有節點
雙親結點:樹中某節點有孩子結點,則這個結點稱為它孩子結點的雙親結 點,雙親結點也稱為前驅結點
孩子結點:樹中一個節點的子樹的根節點稱為該結點的孩子結點,孩子結 點也稱為後繼結點
兄弟結點:具有相同雙親結點的結點稱為兄弟結點
樹的度:樹中所有節點的度的最大值稱為該樹的度
結點的層次:從根節點到樹中某節點所經路徑上的分支數稱為該結點的層 次,根節點的層次為1,其他結點層次是其雙親結點層次加1
樹的深度:樹中所有節點的層次的最大值稱為該樹的深度
有序樹:樹中結點的各棵子樹T0、T1…是有序的,即為有序樹。其中T1 叫做根的第一棵子樹,T2叫著根的第二棵子樹
無序樹:樹中結點的各棵子樹之間的次序不重要,可以相互交換位置
森林:m棵樹的集合(m大於等於0)。在自然界中樹和森林是兩個不同的 概念,但在資料結構中,它們之間的差別很小。刪去一棵非空樹的根節 點,樹就變成森林;反之若增加一個節點,讓森林中每一棵樹的根節點都 變成他的子女,森林就變成一棵樹
樹的表示方法
樹的儲存形式
計算機中儲存樹的資訊,要求既要儲存結點的資料元素資訊,又要儲存結 點之間的邏輯關係資訊
雙親表示法:用指標表示出每個結點的雙親結點
typedef int DataType;
struct Node
{
DataType _data; //結點中的資料
struct Node* _pParent; //指向雙親結點的指標
};
優點:尋找一個節點的雙親結點操作實現很方便
缺點:尋找一個節點的孩子結點很不方便
孩子表示法:用指標指出每個結點的孩子結點
typedef int DataType;
struct Node
{
DataType _data; //結點中的資料
struct Node* _pChild1; //第一個孩子的指標
struct Node* _pChild2; //第二個孩子的指標
struct Node* _pChild3; //第三個孩子的指標
};
優點:尋找一個節點的孩子結點比較方便
缺點:尋找一個節點的雙親結點很不方便
雙親孩子表示法:用指標既表示出每個結點的雙親結點,也表示出每個結點 的孩子結點,即:雙親表示法+孩子表示法
typedef int DataType;
struct Node
{
DataType _data; //結點中的資料
struct Node* _pParent; //雙親結點的指標
struct Node* _pChild1; //第一個孩子的指標
struct Node* _pChild2; //第二個孩子的指標
struct Node* _pChild3; //第三個孩子的指標
};
優點:找某個結點的雙親結點和孩子結點非常方便
孩子兄弟表示法:即表示出每個結點的第一個孩子結點,也表示出每 個結點的下一個兄弟結點
typedef int DataType;
struct Node
{
DataType _data; //結點中的資料
struct Node* _pChild1; //第一個孩子的指標
struct Node* _pNextBrother; //該結點的下一個兄弟結點的指標
};