數據結構與算法筆記 lesson 18 樹

樹 

樹 是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;
}



發佈了103 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章