1. 程式人生 > >資料結構—樹形結構

資料結構—樹形結構

樹的概念

 由N(N>=0)個節點組成的集合。對N > 1的樹,有:

  1. 有一個特殊的結點,稱為根結點,根節點沒有前驅結點
  2. 除根結點外,其餘結點被分成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;  //該結點的下一個兄弟結點的指標
};