1.樹的定義
樹是n(n>=0)個結(jié)點(diǎn)的有限集.n=0時稱為空樹.在任意一顆非空樹種:(1)有且僅有一個特定的稱為根(Root)的結(jié)點(diǎn);(2)當(dāng)n>1時,其余結(jié)點(diǎn)可分為m(m>0)個互不相交的有限集T1,T2,.......Tm,其中每一個集合本身又是一顆樹,并且稱為根的子數(shù)
樹的定義還要強(qiáng)調(diào)兩點(diǎn)
1.n>0時根結(jié)點(diǎn)是唯一的,不可能存在多個根結(jié)點(diǎn),就像每個人只有一個媽媽
2.m>0時,子數(shù)的個數(shù)沒有限制,但是它們一定不能相交,跟第一條原因一樣
2.結(jié)點(diǎn)分類
樹的結(jié)點(diǎn)包含一個數(shù)據(jù)元素及若個指向子數(shù)的分支.結(jié)點(diǎn)擁有的子樹稱為結(jié)點(diǎn)的度.度為0的結(jié)點(diǎn)稱為葉結(jié)點(diǎn)或終端結(jié)點(diǎn)(不可進(jìn)行再分).度不為0的結(jié)點(diǎn)稱為非終結(jié)點(diǎn)或分支結(jié)點(diǎn).除根結(jié)點(diǎn)之外,分支結(jié)點(diǎn)也稱為內(nèi)部結(jié)點(diǎn),樹的度是樹內(nèi)各結(jié)點(diǎn)的度的最大值
3.結(jié)點(diǎn)間關(guān)系
結(jié)點(diǎn)的子數(shù)的根稱為該結(jié)點(diǎn)的孩子,相應(yīng)的,該結(jié)點(diǎn)稱為孩子的雙親.同一個雙親的孩子之間互稱兄弟,結(jié)點(diǎn)的祖先是從根到該結(jié)點(diǎn)所經(jīng)分支上的所有結(jié)點(diǎn),反正,以某結(jié)點(diǎn)為根的子樹中的任一結(jié)點(diǎn)都稱為該結(jié)點(diǎn)的子孫
4.樹的其他關(guān)系概念
結(jié)點(diǎn)的層次是從根開始定義的,根為第一層,根的孩子為第二層.若某結(jié)點(diǎn)在第一層,則其子樹的根就在1+1層.其雙親在同一層的互為堂兄弟.樹中結(jié)點(diǎn)的最大層次稱為樹的深度或高度
森林是m棵互不相交的樹的集合.對樹中每個結(jié)點(diǎn)而言,其子樹的集合即為森林
圖樹的結(jié)構(gòu)關(guān)系圖,A的兩個子樹就可以立即為森林
樹結(jié)構(gòu)和線性結(jié)構(gòu)的對比:
線性結(jié)構(gòu):
1.第一個數(shù)據(jù)結(jié)構(gòu):無前驅(qū)
2.最后一個數(shù)據(jù)元素:無后繼
3.中間元素:一個前驅(qū)一個后繼
樹結(jié)構(gòu)
1.根結(jié)點(diǎn):無雙親,唯一
2.葉結(jié)點(diǎn):無孩子,可以多個
3.中間結(jié)點(diǎn):一個雙親多個孩子
5.樹的抽象數(shù)據(jù)類型
ADT 樹
Data:
樹是由一個根結(jié)點(diǎn)和若干棵子數(shù)構(gòu)成.樹中結(jié)點(diǎn)具有相同數(shù)據(jù)類型及層次關(guān)系
Operation:
InitTree (*T):構(gòu)成空樹T
DestroyTree(*T):銷毀樹T
CreateTree(*T,definition):按definition中給出的樹的定義來構(gòu)造樹
ClearTree(*T):若樹T存在,則將樹T請為空樹
TreeEmpty(T):若T為空樹,返回true,否則返回false
TreeDepth(T):返回T的深度
Root(T):返回T的根結(jié)點(diǎn)
Value(T,cur_e):cur_e是樹T中一個結(jié)點(diǎn),返回此結(jié)點(diǎn)的值
Assign(T,cur_e,value):給樹T的結(jié)點(diǎn)cur_e賦值為value
Parent(T,cur_e):若cur_e是樹T的非根結(jié)點(diǎn),返回它的雙親,否則返回空
LeftChild(T,cur_e):若cur_e是樹T的非葉節(jié)點(diǎn),則返回它的最左孩子,否則返回空
RightSibling(T,cur_e):若cur_e有右兄弟,則返回他的右兄弟,否則返回空
InsertChild(*T,*p,i,c):其中p指向樹T的某個結(jié)點(diǎn),T為所指結(jié)點(diǎn)p的度加上1,非空樹c與T不相交,操作結(jié)果為插入c為樹T中p所指結(jié)點(diǎn)的第i棵子樹
DeleteChile(*T,*p,i):其中p指向樹T的某個結(jié)點(diǎn),i為所指結(jié)點(diǎn)p的度,操作結(jié)果為刪除T中p所指結(jié)點(diǎn)的第i棵子樹
endADT
6.樹的存儲結(jié)構(gòu)
6.1雙親表示法
除了根結(jié)點(diǎn)之外,其余每個結(jié)點(diǎn),它不一定有孩子,但是一定**有且僅有一個**雙親
我們假設(shè)以一組連續(xù)空間存儲樹的特點(diǎn),同時在每個結(jié)點(diǎn)中,附設(shè)一個指示器指示其雙親結(jié)點(diǎn)到鏈表中的位置,也就是說,每個結(jié)點(diǎn)除了知道自己是誰外,還知道他的雙親在哪里
結(jié)點(diǎn)結(jié)構(gòu)定義代碼
//樹的雙親表示法結(jié)點(diǎn)結(jié)構(gòu)定義
#define MAX_TREE_SIZE 100
typedef int TElemType; //樹結(jié)點(diǎn)的數(shù)據(jù)類型,目前暫定義為整型
typedef struct PTNode //結(jié)點(diǎn)結(jié)構(gòu)
{
TElemType data; //結(jié)點(diǎn)數(shù)據(jù)
int parent; //雙親位置
}PTNode;
typedef struct //樹結(jié)構(gòu)
{
PTNode nodes[MAX_TREE-SIZE]; //結(jié)點(diǎn)數(shù)組
int r,n; //根的位置和結(jié)點(diǎn)樹
}PTree;
由于根結(jié)點(diǎn)是沒有雙親的,所有我們約定根結(jié)點(diǎn)的位置域設(shè)置為-1,這就意味著我們所有的結(jié)點(diǎn)都存在他的雙親結(jié)點(diǎn)
我們可以根據(jù)結(jié)點(diǎn)的parent指針很容易找到它的雙親結(jié)點(diǎn),所有時間復(fù)雜度為O(1),知道parent為-1,表示找到了樹結(jié)點(diǎn)的根.可如果我們要知道結(jié)點(diǎn)的孩子是什么,就必須遍歷整個結(jié)構(gòu)才行
我們增加一個結(jié)點(diǎn)最左邊孩子的域,不妨叫它長子域,這樣就可以很容易得到結(jié)點(diǎn)的孩子,如果沒有孩子的結(jié)點(diǎn),這個長子域就這種為-1
對于0個或1個孩子結(jié)點(diǎn)來說,這樣的結(jié)構(gòu)是解決了要找結(jié)點(diǎn)孩子的問題了.甚至有2個孩子,知道長子是誰,另外一個當(dāng)然就是次子
另外一個場景,我們很關(guān)注各兄弟之間的關(guān)系,雙親表示法無法體現(xiàn)這樣的關(guān)系,我們可以增加一個右兄弟域來體現(xiàn)兄弟關(guān)系,也就是說,每一個結(jié)點(diǎn)如果它存在右兄弟,則記錄下右兄弟的下標(biāo),同樣的,如果右兄弟不存在,則賦值為-1
但如果結(jié)點(diǎn)的孩子比較多,超過2個.我們又關(guān)注結(jié)點(diǎn)的雙親,又關(guān)注結(jié)點(diǎn)的孩子,還關(guān)注結(jié)點(diǎn)的兄弟,而是對時間遍歷要求比較高,那么我們還可以把此結(jié)構(gòu)擴(kuò)展為雙親域,長子域還有右兄弟域.
存儲結(jié)構(gòu)的設(shè)計(jì)是一個非常靈活的過程,一個存儲結(jié)構(gòu)設(shè)計(jì)是否合理,取決于基于該存儲結(jié)構(gòu)的運(yùn)送是否合適,是否方便,時間復(fù)雜度好不好等,
6.2孩子表示法
由于樹中每個結(jié)點(diǎn)可能有多棵子樹,可以考慮多重鏈表,即每個指針指向一棵子數(shù)的根結(jié)點(diǎn),我們把這種方法叫多重鏈表表示法.不過,樹的每個結(jié)點(diǎn)的度,也就是它的孩子個數(shù)是不同的
方案一:
一種是指針域的個數(shù)就等于樹的度
這種方法對于樹中各結(jié)點(diǎn)的度相差很大時,顯然很浪費(fèi)空間,因?yàn)橛泻芏嗟慕Y(jié)點(diǎn),他的指針域都是空的.不過如過樹的各結(jié)點(diǎn)度相差很小時,那就意味著開辟空間被充分利用了,這是缺點(diǎn)變優(yōu)點(diǎn)
方案二:按需分配空間
每個結(jié)點(diǎn)指針域的個數(shù)等于該結(jié)點(diǎn)的度,我們專門取一個位置來儲存結(jié)點(diǎn)指針域的個數(shù)
克服了浪費(fèi)空間的缺點(diǎn),對空間利用率提高,但是由于各個結(jié)點(diǎn)的鏈表是不相同的結(jié)構(gòu),加上要維護(hù)結(jié)點(diǎn)的度的數(shù)值,在運(yùn)算上會帶來時間上的損耗
孩子表示法:把每個結(jié)點(diǎn)的孩子結(jié)點(diǎn)排列起來,以單鏈表作存儲結(jié)構(gòu),則n個結(jié)點(diǎn)有n個孩子鏈表,如果是葉子結(jié)點(diǎn)則此鏈表為空.然后n個頭指針又組成一個線性表,采用順序存儲結(jié)構(gòu),存放進(jìn)一個一維數(shù)組中
為此設(shè)置了兩種結(jié)點(diǎn)結(jié)構(gòu):一個是孩子鏈表的孩子結(jié)點(diǎn)
另一個是表頭數(shù)組的表頭結(jié)點(diǎn)
這樣的結(jié)構(gòu)對于我們要查找某個結(jié)點(diǎn)的某個孩子,或者找某結(jié)點(diǎn)的兄弟,只需要查找這個結(jié)點(diǎn)的孩子單鏈表即可.但是要在知道某結(jié)點(diǎn)的雙親是誰,比較麻煩,需要遍歷整棵樹才行.這樣我們就需要另一種表示方法,雙親孩子表示法
6.3孩子兄弟表示法
我們從樹結(jié)點(diǎn)的兄弟的角度來考慮,對于樹的層次結(jié)構(gòu)開始,只研究結(jié)點(diǎn)的兄弟是不行的,任意一棵樹,它的結(jié)點(diǎn)的第一個孩子
如果存在就是唯一的,它的右兄弟如果存在也是唯一的,因此,我們設(shè)置兩個指針,分別指向該結(jié)點(diǎn)的第一個孩子和此結(jié)點(diǎn)的兄弟
6.4二叉樹定義
二叉樹是n(n>=0)個結(jié)點(diǎn)的有限集合,該集合或者為空集(稱為空二叉樹),或者由一個根結(jié)點(diǎn)和兩棵互不相交的,分別稱為根結(jié)點(diǎn)的左子數(shù)和右子數(shù)
6.5.1二叉樹特點(diǎn)
二叉樹的特點(diǎn):
1.每個結(jié)點(diǎn)最多有兩顆子樹,所以二叉樹不存在度大于2的結(jié)點(diǎn)
2.左子樹和右子樹是有順序的,次序不能任意顛倒
3.即使樹中某結(jié)點(diǎn)只有一顆子樹,也要區(qū)分左子數(shù)和右子數(shù)的
二叉樹的五種2基本形態(tài)
1.空二叉樹
2.只有一個根結(jié)點(diǎn)
3.根結(jié)點(diǎn)只有左子樹
4.根結(jié)點(diǎn)只有右子樹
5.樹既有左子樹也有右子樹
6.5.2特殊二叉樹
1.斜樹
斜樹一定是斜的,所有的結(jié)點(diǎn)都只有左子樹的二叉樹叫左斜樹.所有的二叉樹只有右子數(shù)的二叉樹叫右斜樹.這兩者統(tǒng)稱為斜樹
斜樹有個很明顯的特點(diǎn),就是每一層都只有一個結(jié)點(diǎn),結(jié)點(diǎn)的個數(shù)跟樹的深度相同.
有人會想,這那能叫樹,這邊就是線性表么?沒錯,線性表就是特殊的二叉樹
6.5.3滿二叉樹
在一棵二叉樹中,如果所有分支結(jié)點(diǎn)都存在左子數(shù)和右子數(shù),并且所有葉子都在同一層上,這樣的二叉樹稱為滿二叉樹
單個每個結(jié)點(diǎn)都存在左右子數(shù),不能算滿二叉樹,必須所有的葉子結(jié)點(diǎn)都在同一層上,這樣就達(dá)到了整棵樹的平衡.
滿二叉樹的特點(diǎn):
1.葉子只能出現(xiàn)在最下一層,出現(xiàn)在其他層就不可能達(dá)到平衡
2.非葉子結(jié)點(diǎn)的度一定是2,缺胳膊短腿就達(dá)不到圓滿了
3,在同樣深度的二叉樹中,滿二叉樹的結(jié)點(diǎn)個數(shù)最多,葉子樹最多
6.5.4完全二叉樹
對一棵具有n個結(jié)點(diǎn)的二叉樹按層序編號,如果編號為i(1<= i<=n)的結(jié)點(diǎn)與同樣深度的滿二叉樹中編號為i的結(jié)點(diǎn)在二叉樹中位置完全相同,則這棵二叉樹樹完全二叉樹
"完全"和"滿"是有差異的,完全是兩個字,而滿是一個字的,而且筆畫數(shù)也不相同的
好了,不扯了,"完全"和"滿"確實(shí)是有差異的,滿二叉樹一定是完全二叉樹,而完全二叉樹不一定是滿二叉樹
完全二叉樹的特點(diǎn):
1.葉子結(jié)點(diǎn)只能出現(xiàn)在最下兩層
2.最下層的葉子一定集中在左部連續(xù)位置
3.倒數(shù)兩層,若有葉子結(jié)點(diǎn),一定都在右部連續(xù)位置
4.若結(jié)點(diǎn)度為1,則該結(jié)點(diǎn)只有左孩子,即不存在只有右子樹的情況
5.同樣結(jié)點(diǎn)樹的二叉樹,完全二叉樹的深度最小
6.6二叉樹的性質(zhì)
性質(zhì)1:在二叉樹的第i層上至多有2^i-1個結(jié)點(diǎn)(i>=1)
性質(zhì)2:深度為k的二叉樹至多有2^k-1個結(jié)點(diǎn)(k>1)
性質(zhì)3:對任何一棵二叉樹T,如果其終端結(jié)點(diǎn)數(shù)(葉子結(jié)點(diǎn)數(shù))為n0,度為2的結(jié)點(diǎn)數(shù)為n2,則n0 = n2+1
一棵二叉樹中,除了葉子結(jié)點(diǎn)外,剩下的就是度為1或2的結(jié)點(diǎn)樹了,設(shè)n1為度為1的結(jié)點(diǎn)數(shù).則樹的總結(jié)點(diǎn)數(shù)n = n0+n1+n2
性質(zhì)4:具有n個結(jié)點(diǎn)的完全二叉樹的深度為[log2N]+1的結(jié)點(diǎn)按層序編號(從第1層到第[log2N]+1層,每層從左到右),對任一結(jié)點(diǎn)i(1<=<=n)有:
1.如果i= 1,則結(jié)點(diǎn)i是二叉樹的根,無雙親;如果i>1,則雙親是結(jié)點(diǎn)[i/2]
2.如果2i>n,則結(jié)點(diǎn)i無左孩子(結(jié)點(diǎn)i為葉子結(jié)點(diǎn));否則其左孩子是結(jié)點(diǎn)2i
3.如果2i+1>n,則結(jié)點(diǎn)i無右孩子,否則其右孩子是結(jié)點(diǎn)2i+1
對于第一條,i= 1時就是根結(jié)點(diǎn).i> 1,比如結(jié)點(diǎn)7,其雙親結(jié)點(diǎn)為7/2 = 3,結(jié)點(diǎn)9的雙親結(jié)點(diǎn)為9/2 = 4
第二條:比如結(jié)點(diǎn)6,26>10,超過結(jié)點(diǎn)總數(shù).所有該結(jié)點(diǎn)無左孩子,是葉子結(jié)點(diǎn).同樣,結(jié)點(diǎn)5,25 =10,所有它的左孩子是結(jié)點(diǎn)10
第三條:結(jié)點(diǎn)5,25 +1 =11 > 10,所以它無右孩子,而結(jié)點(diǎn)3,23+1=7<10,所有右孩子是結(jié)點(diǎn)7
6.7二叉樹的存儲結(jié)構(gòu)
6.7.1二叉樹順序存儲結(jié)構(gòu)
二叉樹的順序結(jié)構(gòu)是用一維數(shù)組存儲二叉樹中的結(jié)點(diǎn),并且結(jié)點(diǎn)的存儲位置,也就是數(shù)組的下標(biāo)要能體現(xiàn)結(jié)點(diǎn)之間的邏輯關(guān)系,比如雙親與孩子的關(guān)系,左右兄弟的關(guān)系
先舉個特殊的例子,完全二叉樹的存儲
將這棵二叉樹存入到數(shù)組中,相應(yīng)的下標(biāo)對應(yīng)其同樣的位置
完全二叉樹存入到數(shù)組中,相應(yīng)的下標(biāo)對應(yīng)其同樣的位置,而對于一般的二叉樹,盡管層序編號不能反映邏輯關(guān)系,但是可以將其按完全二叉樹
編號,只不過,把不存在的結(jié)點(diǎn)設(shè)置為"^"
考慮一種極端的情況,一棵深度為k的右斜樹,它只有k個結(jié)點(diǎn),卻需要分哦2^k-1個存儲單元,會造成對空間的極度浪費(fèi),所有,順序結(jié)構(gòu)一般只用于完全二叉樹
6.7.2二叉鏈表
順序存儲適用性不強(qiáng),我們就要考慮鏈?zhǔn)酱鎯Y(jié)構(gòu).二叉樹每個結(jié)點(diǎn)最多有兩個孩子,所以為它設(shè)計(jì)一個數(shù)據(jù)域和兩個指針域,我們稱這樣的鏈表為二叉鏈表
圖完全二叉樹的存儲圖片以二叉鏈表表示:
6.8遍歷二叉樹
二叉樹的遍歷是指從根結(jié)點(diǎn)出發(fā),按照某種次序依次訪問二叉樹中所有結(jié)點(diǎn),使得某個結(jié)點(diǎn)被訪問一次且僅被訪問一次
6.8.1二叉樹遍歷方法
1.前序遍歷
若二叉樹為空,則空操作返回,否則
1.先訪問根結(jié)點(diǎn)
2.前序遍歷左子樹,
3.前序遍歷右子樹.
遍歷的順序?yàn)?ABDGHCEIF
2.中序遍歷
若樹為空,則空操作返回
1.從根結(jié)點(diǎn)開始(注意不是先訪問根結(jié)點(diǎn))
2.中序遍歷根結(jié)點(diǎn)的左子樹,然后是訪問根結(jié)點(diǎn)
3.中序遍歷右子樹
,遍歷的順序?yàn)镚DHBAEICF
3.后序遍歷
若樹為空,則空操作返回
1.從左到右先葉子后結(jié)點(diǎn)的方式遍歷訪問左右子樹
2.最后是訪問根結(jié)點(diǎn).
遍歷的順序?yàn)?GHDBIEFCA
4.層次遍歷
若樹為空,則空操作返回
1.從樹的第一層,也就是根結(jié)點(diǎn)開始訪問
2.從上而下逐層遍歷
3.在同一層中,按從左到右的順序?qū)Y(jié)點(diǎn)逐個訪問
6.8.2前序遍歷算法
二叉樹的定義是用遞歸的方式,所以實(shí)現(xiàn)遍歷算法也可以采用遞歸
//二叉樹的前序遍歷遞歸算法
void PreOrderTraverse(BITree T){
if (T == NULL)
return;
printf("%c",T->data);//顯示結(jié)點(diǎn)數(shù)據(jù),可以更改為其他對結(jié)點(diǎn)操作
PreOrderTraverse(T->lchild);//在先前序 遍歷左子樹
PreOrderTraverse(T->rchild);//最后前序遍歷右子樹
}
6.8.3中序遍歷算法
//中序遍歷遞歸算法
void InOrderTraverse(BITree T){
if (T == NULL)
return;
InOrderTraverse(T->lchild);//中序遍歷左子樹
printf("%c",T->data);//顯示結(jié)點(diǎn)數(shù)據(jù),可以更改為其他對結(jié)點(diǎn)操作
InOrderTraverse(T->rchild);//最后中序遍歷右子樹
}
6.8.4后序遍歷算法
void PostOrderTraverse(BITree T){
if (T == NULL)
return;
PostOrderTraverse(T->lchild);//后序遍歷左子樹
PostOrderTraverse(T->rchild);//再后序遍歷右子樹
printf("%c",T->data);//顯示結(jié)點(diǎn)數(shù)據(jù),可以更改為其他對結(jié)點(diǎn)操作
}
6.8.5
中序遍歷:
1.A有左孩子B,從B接著往下遍歷,C無左孩子,所以打印其結(jié)點(diǎn)C
2.然后遍歷C的右孩子D,D有左孩子,接著遍歷F,F無左右孩子,所以 打印其結(jié)點(diǎn)F
3.返回F的上一個結(jié)點(diǎn)D,因?yàn)槠渥蠛⒆右呀?jīng)遍歷過了,可以暫時當(dāng)其不存在,所有打印結(jié)點(diǎn)D
4.結(jié)點(diǎn)D的左孩子已經(jīng)遍歷完成,,所有遍歷其右孩子E,E無左右結(jié)點(diǎn),所以打印其結(jié)點(diǎn)E
5.返回其雙親結(jié)點(diǎn)D,D以打印完成,返回其雙親結(jié)點(diǎn)C,C也打印完成,返回其雙親結(jié)點(diǎn)B,B的左孩子已經(jīng)遍歷過了,所以打印其結(jié)點(diǎn)B
6.遍歷其B的右孩子G,G無左孩子,所有打印G
7.遍歷G的下一個結(jié)點(diǎn)H,H有左孩子I,I有左孩子J,但J無左孩子,所有打印其結(jié)點(diǎn)J
8.結(jié)點(diǎn)I的左孩子已經(jīng)打印完成,所有打印其結(jié)點(diǎn)I
9.遍歷I的右孩子K,K有左孩子L,L無左孩子,打印其結(jié)點(diǎn)L
10.遍歷L的右孩子M,M無左右孩子,打印M
11.返回結(jié)點(diǎn)L,L以打印完成,返回結(jié)點(diǎn)K,K無右孩子,打印其結(jié)點(diǎn)K
12.返回K的雙親結(jié)點(diǎn)I,返回H,H無右孩子,打印其結(jié)點(diǎn)H
13.返回結(jié)點(diǎn)G,返回結(jié)點(diǎn)B,返回結(jié)點(diǎn)A,打印其結(jié)點(diǎn)A
中序的順序:CFDEBGJILMKHA
后序遍歷:
1.A有左孩子B,B有左孩子C,C無左孩子,但有右孩子D,D有左孩子F,F無左右孩子,所有打印結(jié)點(diǎn)F
2.返回結(jié)點(diǎn)D,D有右孩子E,E無左右孩子,打印結(jié)點(diǎn)E
3.返回結(jié)點(diǎn)D,D的左右孩子都已經(jīng)打印完成,可以看成D無左右孩子, 所有打印結(jié)點(diǎn)D
4.返回D的雙親結(jié)點(diǎn)C,C無左孩子,其右孩子已經(jīng)打印完成,所有打印結(jié)點(diǎn)C
5.返回結(jié)點(diǎn)C的雙親結(jié)點(diǎn)B,B有右孩子G,G無左孩子,所以遍歷其右孩子H,H有左孩子I,I有左孩子J,J無左右孩子,所以打印結(jié)點(diǎn)J
6.返回J的雙親結(jié)點(diǎn)I,I有右孩子K,K有左孩子L,L有右孩子M,M無左右孩子,所有打印結(jié)點(diǎn)M
7.返回結(jié)點(diǎn)L,并打印結(jié)點(diǎn)L
8.返回結(jié)點(diǎn)K,并打印結(jié)點(diǎn)K
9.打印結(jié)點(diǎn)I
10.打印結(jié)點(diǎn)H
11.打印結(jié)點(diǎn)G
12.打印結(jié)點(diǎn)B
13.打印結(jié)點(diǎn)A
后序遍歷:FEDCJMLKIHGBA