樹形結構是一類重要的非線性結構,樹形結構中結點之間具備分支,並具備層次結構關係,相似於天然界中的樹; 生活中也大量存在,如家譜,行政組織結構均可以用樹形象的表示;算法
既然天然界中存在這種結構的數據,那計算機中也須要相應的數據結構來存儲; 在計算機領域樹結構也有着普遍的應用,如編譯程序中使用樹表示語法結構,數據庫中用樹(索引)來組織數據,分析算法行爲時可用樹描述其指向過程;數據庫
樹是n (n>=0)個結點的有限集,記作T;當結點數n爲0時稱爲空樹數據結構
當結點數n大於0時,有且僅有一個特定的根結點;spa
除根結點外的其他結點可分爲m(m>=0)個互不相交的子集,T1.T2....Tn,其中每一個子集Ti又是一棵樹,稱之爲子樹3d
任意一棵樹的結點數=分支數+1code
常見的表示法有以下四種:blog
通常表示法索引
文氏圖法it
凹入表示法編譯
嵌套括號法:
(根(子樹,子樹,子樹))
(A(B(E,F),C,D(G)))
其中第1,4兩種最爲常見;
結點
度
葉子結點(終端結點)
分支結點(非終端結點)
孩子(子結點)
雙親(父結點)
祖先
子孫
兄弟
結點的層次(計算方式)
堂兄弟
樹的深度(高度)
有序/無序樹
森林
二叉樹是樹的一種特殊情形,二叉樹在樹結構的應用中起着很是重要的做用,由於二叉樹有許多良好的性質和簡單的物理表示,且任何樹均可以與二叉樹相互轉換,這極大下降了樹的存儲結構及其運算複雜度;
二叉樹是由n(n>=0)個節點組成的有限集合,當結點數n爲0時稱爲空二叉樹,當結點數n>0時,每一個節點最多有兩個子樹,稱爲左子樹和右子樹
每一個節點最多隻能有兩個子樹
子樹有左右之分,且次序不能顛倒
即便只有一個子樹也必須明確左右,這是與樹最主要的差異
二叉樹與樹的對比:
a. 空二叉樹
b. 左右子樹均爲空的二叉樹
c. 右子樹爲空的二叉樹
d. 左子樹爲空的二叉樹
b. 左右子樹都非空的二叉樹
二叉樹之因此重要,因其具有如下5個重要特性
1.在二叉樹的第i(i>=1)層上最多有2^(i-1)個結點
根據該性質可經過層數計算該層結點數量
2.深度爲k(k>=1)的二叉樹中最多有(2^k)-1
根據該性質可經過深度計算總節點數
3.任意一顆二叉樹,若是其葉子結點數爲n0,度爲2的節點數爲n2,則n0 = n2 + 1
證實:
度爲0的結點記爲n0,度爲1的結點記爲n1,度爲2的結點記爲n2
設總結點數爲1,即只有根節點,此時知足n0 = n2+1;
如有總結點數爲n的二叉樹,設n = k時知足n0 = n2+1;
當總節點數n=k+1,即增長一個新節點,設爲s,
若新節點s的的父節點爲葉子結點(無子節點),則增長後葉子數n0不變,n2也不變,此時仍知足n0 = n2+1
若新節點s的的父節點爲有一個孩子的結點,則增長後葉子數n0 = n0+1,n2=n2+1,此時仍知足n0 = n2+1,
故n=任意值均知足n0 = n2+1
4.具備n個節點的徹底二叉樹的深度爲floor(log2n)+1
意爲:以2爲底n的對數向下取整後+1
根據該性質對於徹底二叉樹,可經過結點數求樹的深度
5.若對有n個節點的徹底二叉樹的結點從1開始按層編號(從1層到最後一層,每層從左到右)則樹中任意節點i(1<=i<=n)具備如下特性:
2 * i
,不然結點i無左孩子節點,且i爲葉子節點2 * i + 1
,不然結點i無右孩子節點根據該性質,可方便的判斷節點是不是根節點,求父節點,求左/右子節點,判斷是否爲葉子結點
滿二叉樹
深度爲k(k>=1),且有(2^k)-1個結點的二叉樹.
即:葉子結點的上一層中全部結點的度均爲2的二叉樹爲滿二叉樹,
徹底二叉樹
深度爲K的二叉樹中,K-1層是滿的,且K層結點是左連續的(結點編號是連續的),如圖:
即:倒數第二層是滿的,且最後一層結點是連續的;
滿二叉樹是徹底二叉樹的特殊情形
初始化Initial(BT):創建一顆空二叉樹
求雙親Parent(BT,X):求二叉樹BT上節點X的雙親節點,若X爲BT的根或X不在BT上,結果爲NULL;
求左孩子LChild(BT,X),右孩子RChild(BT,X):求二叉樹BT上結點X的左/右孩子; 若X爲葉子節點或X不在BT上,結果爲NULL;
建二叉樹Create(BT):創建一棵二叉樹BT
遍歷
每一個節點被訪問一次,且每一個節點僅訪問一次,有四種不一樣的遍歷方式