分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!
完全二叉樹是一種效率很高的資料結構,堆就是一種完全二叉樹,所以效率極高。像十分常用的排序演算法、dijkstra演算法、prim演算法等都要用堆才能優化;幾乎每次都要考到的二叉排序樹的效率也要借助平衡性來提高,而平衡性基於完全二叉樹。
完全二叉樹定義完全二叉樹(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;
對於tree,有如下特點:
(1)若i為奇數且i>1,那麼tree[i]的左兄弟為tree[i-1];
(2)若i為偶數且i(3)若i>1,tree[i]的雙親為tree[i div 2];
(4)若2*i<=n,那麼tree[i]的左孩子為tree[2*i];若2*i+1<=n,那麼tree[i]的右孩子為tree[2*i+1];
(5)若i>n/2,那麼tree[i]為葉子結點(對應於(3));
(6)若i
(7)滿二叉樹一定是完全二叉樹,完全二叉樹不一定是滿二叉樹;
(8)完全二叉樹第i層至多有2i-1個節點,共i層的完全二叉樹最多有2i-1個節點。
完全二叉樹葉子結點數的演算法
可以根據公式進行推導,假設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,就可根據完全二叉樹的結點總數計算出葉子結點數。
完全二叉樹的性質
具有n個結點的完全二叉樹的深度為floor(log2n)+1或ceil(log2(n+1))。
證明:設所求完全二叉樹的深度為k。
由完全二叉樹定義可得:
深度為k得完全二叉樹的前k-1層是深度為k-1的滿二叉樹,一共有2k-1-1個結點。
由於完全二叉樹深度為k,故第k層上還有若干個結點,因此該完全二叉樹的結點個數:n>2k-1-1。
由二叉樹的性質可知:n≤2k-1,即:2k-1-1k-1
由此可推出:2k-1≤n<2k,取對數後有:k-1≤lgn由於k-1和k是相鄰的兩個整數,故有k-1=floor(log2n),由此即得:k=floor(log2n)+1。
給我老師的人工智慧教程打call!
資料結構 樹結構 二叉樹 完全二叉樹 滿二叉樹
樹結構是一種描述非線性層次關係的資料結構。除根結點外,其餘每個結點有且僅有乙個直接前驅。每個結點可以有任意多個直接後繼。英文名詞表示 tree,root,node,leaf,edge,child,subtree 要麼二叉樹沒有根結點,是一棵空樹。要麼二叉樹由根結點,左子樹,右子樹組成,且左子樹和右子...
資料結構滿二叉樹和完全二叉樹
國內教程定義 乙個二叉樹,如果每乙個層的結點數都達到最大值,則這個二叉樹就是滿二叉樹。也就是說,如果乙個二叉樹的層數為k,且結點總數是 2 k 1 則它就是滿二叉樹如果一棵深度為k,有n個結點的二叉樹中各結點能夠與深度為k的順序編號的滿二叉樹從1到n標號的結點一一對應的二叉樹稱為 完全二叉樹 一一對...
資料結構 判斷二叉樹是否為完全二叉樹
該方法採取層次遍歷 回憶層次遍歷的實現需要借助乙個佇列,一邊進隊一邊出隊,在出隊的同時對結點進行visit 對於完全二叉樹來說,當訪問到空結點時說明該樹已經完結,之後佇列中也將一直為空。但非完全的二叉樹在空結點之後仍有可能出現資料。根據這個不同,只需正常層次遍歷,在出隊遇到null時,開始檢測後邊的...