【樹】樹、森林和二叉樹的關係

樹的存儲結構
1.雙親表示法
  • 這種方法用一組連續的空間來存儲樹中的結點,在保存每個結點的同時附設一個指示器來指示其雙親結點在表中的位置,其結點的結構如下圖所示:

在這裏插入圖片描述

雙親表示法的形式說明如下:

#define MAX 100
typedef struct TNode
{
  DataType data;
  int parent;
} TNode;

樹可以定義爲:

typedef struct
{
  TNode tree[MAX];
  int nodenum; /*結點數*/
} ParentTree;

在這裏插入圖片描述在這裏插入圖片描述

2.孩子表示法
  • 這種方法通常是把每個結點的孩子結點排列起來,構成一個單鏈表,稱爲孩子鏈表。n 個結點共有 n 個孩子鏈表(葉子結點的孩子鏈表爲空表),而 n 個結點的數據和 n 個孩子鏈表的頭指針又組成一個順序表。

在這裏插入圖片描述

孩子表示法的存儲結構定義如下:

typedef struct ChildNode /* 孩子鏈表結點的定義 */
{
  int Child;              /* 該孩子結點在線性表中的位置 */
  struct ChildNode *next; /*指向下一個孩子結點的指針 */
} ChildNode;
typedef struct /* 順序表結點的結構定義 */
{
  DataType data;         /* 結點的信息 */
  ChildNode *FirstChild; /* 指向孩子鏈表的頭指針 */
} DataNode;
typedef struct /* 樹的定義 */
{
  DataNode nodes[MAX]; /* 順序表 */
  int root;            /* 該樹的根結點在線性表中的位置 */
  int num;             /* 該樹的結點個數 */
} ChildTree;
3.孩子兄弟表示法(最重要)
  • 這種表示法又稱爲樹的二叉表示法,或者二叉鏈表表示法,即以二叉鏈表作爲樹的存儲結構。鏈表中每個結點設有兩個鏈域,分別指向該結點的第一個孩子結點和下一個兄弟(右兄弟)結點。

在這裏插入圖片描述

孩子兄弟表示法的類型定義如下:

typedef struct CSNode
{
  DataType data;              /*結點信息*/
  Struct CSNode *FirstChild;  /*第一個孩子*/
  Struct CSNode *Nextsibling; /*下一個兄弟*/
} CSNode, *CSTree;

這種存儲結構便於實現樹的各種操作,例如,如果要訪問結點 x 的第 i 個孩子,則只要先從FirstChild 域找到第一個孩子結點,然後沿着這個孩子結點的 Nextsibling 域連續走 i-1 步,便可找到 x的第 i 個孩子。如果在這種結構中爲每個結點增設一個 Parent 域,則同樣可以方便地實現查找雙親的操作。

樹、森林與二叉樹的相互轉換

前面介紹了樹的存儲結構和二叉樹的存儲結構,從中可以看到,樹的孩子兄弟鏈表結構與二叉樹的二叉鏈表結構在物理結構上是完全相同的,只是它們的邏輯含義不同,所以樹和森林與二叉樹之間必然有着密切的關係。本節介紹樹和森林與二叉樹之間的相互轉換方法。

1.樹轉換爲二叉樹

在這裏插入圖片描述在這裏插入圖片描述
在這裏插入圖片描述

2.森林轉換爲二叉樹
  • 森林是若干棵樹的集合。樹可以轉換爲二叉樹,森林同樣也可以轉換爲二叉樹。因此,森林也可以方便地用孩子兄弟鏈表表示。

在這裏插入圖片描述

3.二叉樹還原爲樹或森林

在這裏插入圖片描述

樹與森林的遍歷
1.樹的遍歷

在這裏插入圖片描述
在這裏插入圖片描述
方法一:

void RootFirst(CSTree root)
{
  if (root != NULL)
  {
    Visit(root->data); /* 訪問根結點 */
    p = root->FirstChild;
    while (p != NULL)
    {
      RootFirst(p); /* 訪問以 p 爲根的子樹 */
      p = p->Nextsibling;
    }
  }
}

方法二:

void RootFirst(CSTree root)
{
  if (root != NULL)
  {
    Visit(root->data);            /*訪問根結點*/
    RootFirst(root->FirstChild);  /*先根遍歷首子樹*/
    RootFirst(root->Nextsibling); /*先根遍歷兄弟樹*/
  }
}
2.森林的遍歷

在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述
例如,右圖中森林的後序遍歷序列爲 DCBFJIHGEA。
在這裏插入圖片描述

對照二叉樹與森林之間的轉換關係可以發現,森林的先序遍歷、中序遍歷和後序遍歷與其相應二叉樹的先序遍歷、中序遍歷和後序遍歷是對應相同的,因此可以用相應二叉樹的遍歷結果來驗證森林的遍歷結果。另外,樹可以看成只有一棵樹的森林,所以樹的先根遍歷和後根遍歷分別與森林的先序遍歷和中序遍歷對應。森林的遍歷算法可以採用其對應的二叉樹的遍歷算法來實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章