溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

樹的存儲結構

發布時間:2020-09-25 10:17:13 來源:網絡 閱讀:1373 作者:BarnabyRoss 欄目:編程語言

   提到存儲結構,可以很自然的想到順序存儲結構和鏈式存儲結構兩種。樹這種數據結構類型,它是由結點和聯接結點的邊構成。這些邊,聯接了樹中的任意兩個結點,從計算機內存中的存儲方式來看,其實,就是通過指針保存了地址,從而實現了兩個結點間的聯接。

   那么關于樹的表示方式,先講一下最簡單的,就是雙親表示法,我把它稱之為父節點表示法。畢竟,在樹中,雙親結點其實就是父節點。既然,鏈表也是有結點構成,那么,這個結點中,必然的必須得有能夠存放數據的變量,以及存放下一個結點的地址的變量,如果沒有這個變量,如何建立兩個結點間的聯接呢?但是,此時,這個存放的地址的變量,并不是存放下一個結點的地址,存放的是它的父節點的地址,也就是父節點在數組中的下標位置。然后還得再定義一個樹結構,這個數結構中,必須得包含一個數組,因為數組就是用來表示結點的,還得有一個根節點的位置變量以及結點數的變量。那么,該結構定義如下:

#define MAX_TREE_SIZE  100
typedef int TElemType;
typedef struct PTNode{

    TElemType data;
    int parent;
}PTNode;

typedef struct{

    PTNode nodes[MAX_TREE_SIZE];
    int r, n;
}PTree;

因為,根節點就是祖先,所以它沒有父類,所以,約定,根節點的位置域設置為-1。

樹的存儲結構

如上圖所示,結點A就是根結點。

下標    data    parent
 0        A        -1
 1        B        0
 2        C        0
 3        D        0
 4        E        1
 5        F        1
 6        G        1
 7        H        2
 8        I        3
 9        J        3

因為B的父親是A,所以B中存放了A的下標0,C和D的父親都是A,所以都存放了下標0,E、F和G的父親是B,所以它們存放了B的下標1;H的父親是C,所以H存放了下標2;I和J的父親是D,所以它們存放了D的下標3。這種方式可以知道哪個結點是哪個結點的父親,哪個結點是哪個結點的兒子,但是卻無法確定順序,也就是說,一個結點可能擁有多個子節點,但是卻無法確定這些子節點哪個在前哪個在后。雙親表示法求父節點方便,因為每個結點中都保存了其父節點的下標。

   第二種方式。孩子表示法。依然采用連續存儲,也就是數組存儲,不過,一個結點分為兩部分,一部分放數據,另一部分放其子節點的指針(地址)。若是一個結點有多個孩子,假設A有三個孩子,B、C和D。那么,A中就存放B的指針域,在B中則存放C的指針域,C中則存放D的指針域,也就是A的孩子采用了鏈式存儲的方式,串聯了起來。孩子表示法,求其子節點比較方便,而求其父節點就比較麻煩。

樹的存儲結構

孩子表示法結構代碼如下:

#define MAXZ_TREE_SIZE  100
typedef struct CTNode{
    
    int child;
    struct CTNode *next;
}*ChildPtr;

typedef struct{

    TElemType data;
    ChildPtr firstchild;
}CTBox;

typedef struct{

    CTBox nodes[MAX_TREE_SIZE];
    int r, n;   //存放樹的根和結點數
    
}CTree;

   第三種方式。父親孩子表示法。顧名思義,就是將前兩種方式結合了。也就是說,一個結點不止存放數據,還存放該該節點的父節點的下標,還存放該節點子節點的指針,那為什么父節點可以存放下標,存放子節點就只能存放子節點的指針?因為,一個結點只有一個父節點,卻有多個子節點,或者是沒有子節點,所以沒有辦法確定子節點的個數,于是,就只能通過鏈式存儲了。

樹的存儲結構

        二叉樹法(孩子兄第表示法)就是將一般樹轉化為二叉樹。具體轉化方式為:左指針指向它的第一個孩子結點,右指針指向它的第一個兄弟結點。

二叉樹法結構代碼定義如下:

typedef struct CSNode{
    
    TElemType data;
    struct CSNode *firstchild, *rightsib;

}CSNode, *CSTree;

樹的存儲結構

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女