1、順序儲存結構
利用一段連續的儲存空間,即陣列的形式,按照滿二叉樹的結構,從上到下,從左到右,按順序將元素存入陣列中,空缺的元素用零補齊。對於滿二叉樹和完全二叉樹,陣列中沒有零元素,空間利用率達到100%。但其餘情況下空間利用率低,所以順序儲存結構最適用於完全二叉樹(滿二叉樹可以視為完全二叉樹);
2、鏈式儲存結構
使用鍊錶儲存,鍊錶的每個結點的儲存結構為:資料域 + 左孩子指標 + 右孩子指標。
這樣的儲存結構優勢在於不論何種形式的二叉樹都可以較好的利用空間,但是由於葉子結點的左右指標域都為空,沒有很好的利用上。
1、parents表示法(即書中所謂雙親表示法,這種翻譯怎麼看怎麼奇怪)
將樹中的所有元素按照從上到下,從左到右的順序依次記錄到陣列中對應的各資料域,再將其parents的位址(在陣列中就是parents的序號)分別存入對應的指標域。樹的根沒有parents(孤兒),所以指標域置為-1或其他約定好的數字。
parents表示法的優勢在於方便找到各元素的parents結點,但要找到某個元素的子節點就必須要遍歷整個陣列,時間複雜度較高。
2、孩子表示法
有兩種方法可以實現:
孩子表示法總體來說就是通過鍊錶的形式,表示出樹中每個元素的孩子元素。孩子表示法可以很方便找到元素的孩子,但是不容易找到它的parents。
3、parents-children表示法
通過吸收孩子表示法和parents表示法各自的優勢,在孩子表示法的第一種實現的基礎上,在儲存所有元素的陣列中,給每個元素都新增一項其parents的位址(這裡當然是陣列中的序號)
其實陣列和鍊錶從儲存形式上來說並沒有不可逾越的鴻溝,它們都可以相互改造生成的,陣列和鍊錶表現有差異的地方在於進行基本的線性表處理時(比如增刪改查)的方便程度
4、孩子兄弟法
這樣的儲存方式可以很好的找到所有的孩子結點,同時這樣的結構和二叉樹的二叉鍊錶的形式完全相同,便於將一般的樹轉變為二叉樹處理。
huffman樹嚴格來說是一棵二叉樹,但是由於其:
1、需要通過向上回溯直至根結點以此來得到某個葉子結點的huffman編碼,所以每個元素都必須有其parents的位址;
2、需要知道元素是其parents的左孩子還是右孩子(決定了編碼為0還是1);
3、huffman樹構造的過程中依賴各結點的權重,所以需要開闢權重域。
綜上所述,需要建立乙個專門為huffman樹服務的資料結構。
huffman樹查詢頻繁,所以肯定優先考慮陣列結構;結合以上的需求分析,huffman樹的每個結點都要知道其左右孩子和parents的位址(即陣列中元素的序號),且不需要設定資料域。所以使用復合陣列,陣列中每個元素分別包含:parents位址 + 左孩子位址 + 右孩子位址 + 權重域。這樣的結構既方便回溯,同時也方便建立huffman結構(提供權重域,便於在建立過程中儲存子樹根結點的權重值)。
資料結構中,幾種樹的結構表示方法(C語言實現)
樹的多種結構定義 define max tree size 100typedef inttemptype 雙親 表示法 typedef struct ptnode 結點結構 ptnode typedef struct 樹結構 ptree 孩子 表示法 typedef struct ctnode 結點...
資料結構的幾種儲存方式
資料的儲存結構是資料結構的乙個重要內容。在計算機中,資料的儲存結構可以採取如下四中方法來表現。1 順序儲存方式 簡單的說,順序儲存方式就是在一塊連續的儲存區域 乙個接著乙個的存放資料。順序儲存方式把邏輯上相連的結點儲存在物理位置上相鄰的儲存單元裡,結點間的邏輯關係由儲存單元的鄰接掛安息來體現。順序儲...
資料結構中資料儲存的幾種形式
1.棧 資料從乙個口進,從乙個口出 特點 先入後出 2.佇列 資料用兩個口進,從兩個口出 特點 先入先出 3.陣列 特點 查詢容易,增刪難 例子 int arr new int 1,2,3,4 當建立陣列的時候,對於1,2,3,4已經建立索引,並且將首位址賦予arr,要是查詢,就很快 對於增刪操作,...