完全二叉樹

完全二叉樹

非線性數據結構的常見形式
完全二叉樹是重要的非線性數據結構二叉樹的一種常見形式。[1]完全二叉樹的定義、性質以及算法見正文,這裡補充一點:完全二叉樹是效率很高的數據結構,堆是一種完全二叉樹或者近似完全二叉樹,所以效率極高,像十分常用的排序算法、Dijkstra算法、Prim算法等都要用堆才能優化,幾乎每次都要考到的二叉排序樹的效率也要借助平衡性來提高,而平衡性基于完全二叉樹。
    中文名:完全二叉樹 外文名: 适用領域: 所屬學科: 英文名:Complete Binary Tree 日語:完全二進法の木 德語:Komplett - baum

判斷

完全二叉樹:除最後一層外,每一層上的節點數均達到最大值;在最後一層上隻缺少右邊的若幹結點。

定義

完全二叉樹(Complete Binary Tree)

若設二叉樹的深度為h,除第h層外,其它各層(1~h-1)的結點數都達到最大個數,第h層所有的結點都連續集中在最左邊,這就是完全二叉樹。

完全二叉樹是由滿二叉樹而引出來的。對于深度為K的,有N個結點的二叉樹,當且僅當其每一個結點都與深度為K的滿二叉樹中編号從1至n的結點一一對應時稱之為完全二叉樹。

若一棵二叉樹至多隻有最下面的兩層上的結點的度數可以小于2,并且最下層上的結點都集中在該層最左邊的若幹位置上,則此二叉樹成為完全二叉樹。

特點

葉子結點隻可能在最大的兩層上出現,對任意結點,若其右分支下的子孫最大層次為L,則其左分支下的子孫的最大層次必為L或L+1;

出于簡便起見,完全二叉樹通常采用數組而不是鍊表存儲,其存儲結構如下:

var tree:array[1..n]of longint;{n:integer;n>=1}

對于tree有如下特點:

(1)若i為奇數且i>1,那麼tree的左兄弟為tree[i-1];

(2)若i為偶數且i

(3)若i>1,tree的雙親為tree[i div2];

(4)若2*i<=n,那麼tree的左孩子為tree[2*i];若2*i+1<=n,那麼tree的右孩子為tree[2*i+1];

(5)若i>n div 2,那麼tree[i]為 葉子結點(對應于(3))

(6)若i<(n-1)div2.那麼tree[i]必有兩個孩子(對應于(4))

(7)滿二叉樹一定是完全二叉樹,完全二叉樹不一定是滿二叉樹

完全二叉樹第i層至多有2^(i-1)個 節點,共i層的完全二叉樹最多有2^i-1個節點。

算法

完全二叉樹葉子結點的算法

如果一棵具有n個結點的深度為k的二叉樹,它的每一個結點都與深度為k的滿二叉樹中編号為1~n的結點一一對應,這棵二叉樹稱為完全二叉樹。

可以根據公式進行推導,假設n0是度為0的結點總數(即葉子結點數),n1是度為1的結點總數,n2是度為2的結點總數,由二叉樹的性質可知:n0=n2+1,則n=n0+n1+n2(其中n為完全二叉樹的結點總數),由上述公式把n2消去得:n=2n0+n1-1,由于完全二叉樹中度為1的結點數隻有兩種可能0或1,由此得到n0=(n+1)/2或n0=n/2。總結起來,就是n0=[n/2],其中[]表示上取整。可根據完全二叉樹的結點總數計算出葉子結點數。

上一篇:EL表達式

下一篇:回歸測試

相關詞條

相關搜索

其它詞條