1. 程式人生 > 其它 >資料結構 - 樹 - 一般樹和森林的基本介紹

資料結構 - 樹 - 一般樹和森林的基本介紹

樹的儲存結構

雙親表示法

通過儲存樹中每個結點的雙親結點的位置,來表示樹中結點之間的結構關係。

#define MAX_TREE_SIZE  100
typedef struct PTNode
{
    ElemType data;
    int parent;    // 雙親位置(雙親的下標)
} PTNode;
typedef struct
{
    PTNode nodes[MAX_TREE_SIZE];
    int r, n;      // r為根的位置,n為結點數
} Ptree;

孩子表示法

通過儲存樹中每個結點的孩子結點的位置,表示樹中結點之間的結構關係。

方法一:多重連結串列

類似於二叉連結串列,我們可以用多叉連結串列。具體實現有兩種方式:定長結點不定長結點

  • 定長結點:優點是結點結構一致,便於實現樹的操作,缺點是浪費一些記憶體空間。
  • 不定長結點:優點是節省記憶體空間,缺點是不定長的結點會使一些操作實現變複雜。

方法二:孩子連結串列

將樹中的每個結點的孩子排列起來,看成一個線性表,採用線性連結串列進行儲存。

樹的孩子連結串列的型別定義如下:

typedef struct CTNode  // 孩子結點
{
    int child;
    struct CTNode* next;
} *ChildPtr;
typedef struct
{
    ElemType data;
    ChildPtr firstchild; // 孩子連結串列頭指標
} CTBox;
typedef struct
{
    CTBox nodes[MAX_TREE_SIZE];
    int n, r;   // 結點數和根的位置
} CTree;

孩子兄弟表示法

我們也可以仍用二叉連結串列作為樹的儲存結構。

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

typedef struct CSNode
{
    ElemType data;
    struct CSNode
        * firstchild,  //指向第一個孩子
        * nextsibling; //指向下一個兄弟
} CSNode, * CSTree;

樹與二叉樹

樹與二叉樹的轉換

二叉樹和樹都可以用二叉連結串列儲存,我們可以以二叉連結串列為中介,實現樹與二叉樹之間的轉換。其轉換的方法圖示如下:

森林與二叉樹的轉換

森林:樹的集合。

將森林中的樹的根結點看作兄弟,用樹與二叉樹的轉換方法,進行森林與二叉樹的轉換。

樹的遍歷

遍歷:按一定規律走遍樹的各個頂點,且使每一頂點僅被訪問一次,即找一個完整而有規律的走法,以得到樹中所有結點的一個線性序列。

常用方法如下:

  • 先根(序)遍歷:先訪問樹的根結點,然後依次先根遍歷根的每棵子樹。

  • 後根(序)遍歷:先依次後根遍歷每棵子樹,然後訪問根結點。

  • 層次遍歷:先訪問第一層上的結點,然後依次遍歷第二層,一直到最後一層的結點。

廣義表建樹