順序儲存二叉樹的壓縮演算法

2022-03-25 10:58:11 字數 947 閱讀 6212

摘要:順序二叉樹占用空間大而又插入刪除不便,討論二叉樹壓縮儲存的文章並不多見。但順序二叉樹的查詢非常方便。本文提供了一種基於葉結點的位置對二叉樹的壓縮儲存,稱為葉結點位置法。

這種演算法依據了二叉樹的以下基本性質:

1:在任意一棵二叉樹中,若其終端結點數為n0,度為2的結點數為n2,則n0=n2

+1。2、如果對一棵有n個結點的完全二叉樹的結點按層序排列,從1開始編號,則對任一編號為i的結點,如果其左、右孩子結點,則它們的編號分別為2i,2i+1。

這個方法的基本思路是:二叉樹的任一結點都是葉結點或葉結點的的父結點/祖父結點。把一棵任意的二叉樹補充為完全二叉樹後並按層序從1開始編號,則原二叉樹中任一結點的編號都可以根據葉子結點的編號計算出來。

例如,下圖是一棵簡單二叉樹。

其用葉結點位置法壓縮的結果是:

a[6]=[a,b,c,d,e,f];

b[3]=[2,6,15]

a為結點的data資訊,b中的2,6,14分別為葉結點b,d,f在將該二叉樹補充為完全二叉樹時的層次遍歷編號。結點a,c,e的編號可以通過其葉結點的編號計算出來。例如,結點e的編號為int (15/2)=7。

下面的演算法實現了將壓縮儲存的二叉樹還原成出非空結點的序號。根據葉結點的位置資訊a計算出二叉樹中非空結點的位置資訊,並按倒序儲存在陣列b中。

下面編碼在turboc2.0中測試通過。

#include

void main()

;int b[15]=;

int j=0;

int left,middle,right,k;

int n=5;

clrscr();

b[0]=a[n];

j++;

while(n>1)

b[j]=a[n];

j++;

}for(j=0;j<15;j++)

printf("%d\n",b[j]);

}

順序儲存二叉樹

從資料儲存來看,陣列儲存方式和樹的儲存方式可以相互轉換,即陣列可以轉換成樹,樹也可以轉換成陣列,看下面的示意圖。順序二叉樹通常只考慮完全二叉樹 第n個元素的左子節點為 2 n 1 第n個元素的右子節點為 2 n 2 第 n 個元素的父節點為 n 1 2 n 表示二叉樹中的第幾個元素 按 0 開始編號...

順序儲存二叉樹

從資料儲存來看,陣列儲存方式和樹的儲存方式可以相互轉換,即陣列可以轉換成樹,樹也可以轉換成陣列。陣列轉換成樹即是將陣列中的各個元素按照二叉樹的層次儲存起來的過程。原陣列 1,2,3,4,5,6,7 轉換為順序二叉樹如下圖所示 順序儲存二叉樹的特點 通常只考慮完全二叉樹 第n個元素的左子節點為2 n ...

順序儲存二叉樹

package com.datastructure.tree.binarytree 順序儲存二叉樹 1。順序儲存二叉樹通常只考慮完全二叉樹 2。第n個元素的左子節點為2 n 1 3。第n個元素的右子節點為2 n 2 4。第n個元素的父親節點為 n 1 2 public class sequentia...