數據結構與算法4:樹的基本存儲結構

    樹的存儲結構主要由雙親表示法和孩子表示法,以及它們的各種改造版本。

    由於計算機內存是線性的,而線性關係不能直接表示樹的存儲結構,因此我們需要設計一種能夠在線性環境下表示樹的數據結構的存儲方式。可以存儲樹的數據結構很多,每種結構有自己的特點和適用的場景,根據實際需要來使用。

    雙親表示法:
    雙親表示法是指在每個節點中表示它的父節點的位置。整個樹的節點作爲一個數組或鏈表存放。
/*雙親表示法*/
typedef struct
{
 type data;
 int parent;
} node;
typedef struct
{
 node nodes[MAXNUM];
 int n;
 int r;
} tree;


    孩子表示法:
    孩子表示法是指給每個節點加上孩子的信息。如果樹的度確定,比如二叉樹,那麼可以直接在每個節點中存儲每個孩子的指針,很簡單有效,不多說了。但是對於度不確定或者很大的情況下,這樣的存儲方式是非常浪費空間的。因此還有另一種表示方法,節點存放於線性表中,每個節點的全部孩子節點的信息組成一個鏈表,該節點的指針指向這個鏈表,鏈表以nil表示結束。這樣的存儲結構儘管也有一小部分nil指針,但減少了很多,而且比較靈活。
/*孩子表示法 孩子鏈表形式*/
typedef struct child
{
 int child;
 struct child* next;
} child;
typedef struct
{
 type data;
 child* child;
} node;
typedef struct
{
 node nodes[MAXNUM];
 int n;
 int r;
} tree;




    孩子兄弟表示法:
    孩子兄弟表示法實際上是用一個二叉樹來表示樹的結構。每個節點的一個指針指向第一個孩子,第二個指針指向右邊的第一個兄弟節點。這種存儲方式節省空間,操作方便,但樹的原本的層次結構被破壞了。

    孩子雙親表示法:
    孩子雙親表示法是對上面兩種方法的綜合。雙親表示法不便從上往下查找,孩子表示法不便從下網上查找,那麼孩子雙親表示法就把兩種信息都放到一起,這樣可以有更好的訪問速度,但是也會佔用更多空間。

    二叉樹作爲一種特殊的樹,可以有其他的存儲方式。
    順序存儲:假如是完全二叉樹或者接近完全二叉樹,那麼可以按照層序關係直接順序排列,因爲根據公式可以知道每個元素應該在哪裏。缺點是僅適用於接近滿的二叉樹,否則很浪費空間。
    二叉鏈表:完全按照樹的結構,用指針連起來。最直觀的方式,也很省空間。
    三叉鏈表:比二叉鏈表多了一個向上的指針。這個看具體情況吧。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章