樹的儲存結構主要由雙親表示法和孩子表示法,以及它們的各種改造版本。
雙親表示法:
雙親表示法是指在每個節點中表示它的父節點的位置。整個樹的節點作為乙個陣列或鍊錶存放。
/*雙親表示法*/
typedef struct
node;
typedef struct
tree;
孩子表示法:
孩子表示法是指給每個節點加上孩子的資訊。如果樹的度確定,比如二叉樹,那麼可以直接在每個節點中儲存每個孩子的指標,很簡單有效,不多說了。但是對於度不確定或者很大的情況下,這樣的儲存方式是非常浪費空間的。因此還有另一種表示方法,節點存放於線性表中,每個節點的全部孩子節點的資訊組成乙個鍊錶,該節點的指標指向這個鍊錶,鍊錶以nil表示結束。這樣的儲存結構儘管也有一小部分nil指標,但減少了很多,而且比較靈活。
/*孩子表示法 孩子鍊錶形式*/
typedef struct child
child;
typedef struct
node;
typedef struct
tree;
孩子兄弟表示法:
孩子兄弟表示法實際上是用乙個二叉樹來表示樹的結構。每個節點的乙個指標指向第乙個孩子,第二個指標指向右邊的第乙個兄弟節點。這種儲存方式節省空間,操作方便,但樹的原本的層次結構被破壞了。
孩子雙親表示法:
孩子雙親表示法是對上面兩種方法的綜合。雙親表示法不便從上往下查詢,孩子表示法不便從下網上查詢,那麼孩子雙親表示法就把兩種資訊都放到一起,這樣可以有更好的訪問速度,但是也會占用更多空間。
二叉樹作為一種特殊的樹,可以有其他的儲存方式。
順序儲存:假如是完全二叉樹或者接近完全二叉樹,那麼可以按照層序關係直接順序排列,因為根據公式可以知道每個元素應該在**。缺點是僅適用於接近滿的二叉樹,否則很浪費空間。
二叉鍊錶:完全按照樹的結構,用指標連起來。最直觀的方式,也很省空間。
三叉鍊錶:比二叉鍊錶多了乙個向上的指標。這個看具體情況吧。
資料結構與演算法(4) 樹
結點的度 乙個結點含有的子樹的個數稱為該結點的度 葉結點 度為0的結點稱為葉結點,也可以叫做終端結點 分支結點 度不為0的結點稱為分支結點,也可以叫做非終端結點 結點的層次 從根結點開始,根結點的層次為1,根的直接後繼層次為2,以此類推 結點的層序編號 將樹中的結點,按照從上層到下層,同層從左到右的...
資料結構與演算法系列 串 串的基本概念與儲存結構
串是一種特殊的線性表,他的資料物件是字符集和,它的每個元素都是乙個字元一系列相連的字元就組成了乙個字串,簡稱串 串的描述 s a1a2a3.an n 0 n稱為串的長度 線性表的順序儲存結構和鏈式儲存結構對於串來說都是適用的。串的靜態儲存結構採用順序儲存結構,簡稱順序串。描述 typedef str...
資料結構與演算法知識樹整理 資料結構篇 線性結構
低效的 插入 和 刪除 容器能否完全替代陣列?為什麼大多數程式語言中,陣列要從 0 開始編號,而不是從 1 開始呢?單鏈表雙向鍊錶 刪除給定指標指向的結點。迴圈鍊錶 鍊錶 vs 陣列效能大比拼 如何實現乙個 棧 棧的應用 順序佇列和鏈式佇列 迴圈佇列 public class circularque...