二叉樹(shù)的基本概念
二叉樹(shù)是每個(gè)節(jié)點(diǎn)最多有兩個(gè)子樹(shù)的樹(shù)結(jié)構(gòu)。通常子樹(shù)被稱(chēng)作“左子樹(shù)”(left?subtree)和“右子樹(shù)”(right?subtree)。
二叉樹(shù)的性質(zhì)(特性)
性質(zhì)1:在二叉樹(shù)的第i層上至多有2**(i-1)個(gè)結(jié)點(diǎn)(i>0)
性質(zhì)2:深度為k的二叉樹(shù)至多有2**k?-?1個(gè)結(jié)點(diǎn)(k>0)
性質(zhì)3:對(duì)于任意一棵二叉樹(shù),如果其葉結(jié)點(diǎn)數(shù)為N0,而度數(shù)為2的結(jié)點(diǎn)總數(shù)為N2,則N0=N2+1;
性質(zhì)4:具有n個(gè)結(jié)點(diǎn)的完全二叉樹(shù)的深度必為?log2(n+1)
性質(zhì)5:對(duì)完全二叉樹(shù),若從上至下、從左至右編號(hào),則編號(hào)為i?的結(jié)點(diǎn),其左孩子編號(hào)必為2i,其右孩子編號(hào)必為2i+1;其雙親的編號(hào)必為i/2(i=1?時(shí)為根,除外)
二叉樹(shù)的遍歷
樹(shù)的遍歷是樹(shù)的一種重要的運(yùn)算。所謂遍歷是指對(duì)樹(shù)中所有結(jié)點(diǎn)信息的訪問(wèn),即依次對(duì)樹(shù)中每個(gè)結(jié)點(diǎn)訪問(wèn)一次且僅訪問(wèn)一次,我們把這種對(duì)所有節(jié)點(diǎn)的訪問(wèn)稱(chēng)為遍歷(traversal)。那么樹(shù)的兩種重要的遍歷模式是深度優(yōu)先遍歷和廣度優(yōu)先遍歷,深度優(yōu)先一般用遞歸,廣度優(yōu)先一般用隊(duì)列。一般情況下能用遞歸實(shí)現(xiàn)的算法大部分也能用堆棧來(lái)實(shí)現(xiàn)。
深度優(yōu)先遍歷:對(duì)于一棵二叉樹(shù),深度優(yōu)先搜索(Depth?First?Search)是沿著樹(shù)的深度遍歷樹(shù)的節(jié)點(diǎn),盡可能深的搜索樹(shù)的分支。深度遍歷有重要的三種方法,這三種方式常被用于訪問(wèn)樹(shù)的節(jié)點(diǎn),它們之間的不同在于訪問(wèn)每個(gè)節(jié)點(diǎn)的次序不同。這三種遍歷分別叫做先序遍歷(preorder),中序遍歷(inorder)和后序遍歷(postorder)。
先序遍歷:先訪問(wèn)根節(jié)點(diǎn),然后遞歸使用先序遍歷訪問(wèn)左子樹(shù),再遞歸使用先序遍歷訪問(wèn)右子樹(shù)
即:根節(jié)點(diǎn)->左子樹(shù)->右子樹(shù)
中序遍歷:遞歸使用中序遍歷訪問(wèn)左子樹(shù),然后訪問(wèn)根節(jié)點(diǎn),最后再遞歸使用中序遍歷訪問(wèn)右子樹(shù)
即:左子樹(shù)->根節(jié)點(diǎn)->右子樹(shù)
后序遍歷:先遞歸使用后序遍歷訪問(wèn)左子樹(shù)和右子樹(shù),最后訪問(wèn)根節(jié)點(diǎn)
即:左子樹(shù)->右子樹(shù)->根節(jié)點(diǎn)
廣度優(yōu)先遍歷(層次遍歷):從樹(shù)的root開(kāi)始,從上到下從從左到右遍歷整個(gè)樹(shù)的節(jié)點(diǎn)
二叉樹(shù)的創(chuàng)建和遍歷
通過(guò)使用Node類(lèi)中定義三個(gè)屬性,分別為elem本身的值,還有l(wèi)child左孩子和rchild右孩子,來(lái)創(chuàng)建節(jié)點(diǎn),定義一個(gè)Tree的類(lèi)用來(lái)創(chuàng)建二叉樹(shù),并為其添加增加節(jié)點(diǎn)和進(jìn)行遍歷的方法。
注意:在深度優(yōu)先遍歷中,兩種遍歷方式結(jié)合可以唯一確定一棵二叉樹(shù),其中必須有中序遍歷,要學(xué)會(huì)如何根據(jù)中序遍歷和其他任意一種遍歷方式寫(xiě)出第三種遍歷。