數(shu)據(ju)結(jie)構~二(er)叉樹(shu)
二叉樹也是定義的,二叉樹是非線性結構,其結點有(you)左右子(zi)(zi)樹(shu)(shu)(shu)之(zhi)分,邏輯上二(er)(er)(er)叉(cha)(cha)(cha)樹(shu)(shu)(shu)有(you)五種基本形態: (1)空二(er)(er)(er)叉(cha)(cha)(cha)樹(shu)(shu)(shu)——(a); (2)只有(you)一個根結點的(de)二(er)(er)(er)叉(cha)(cha)(cha)樹(shu)(shu)(shu)——(b); (3)右子(zi)(zi)樹(shu)(shu)(shu)為(wei)空的(de)二(er)(er)(er)叉(cha)(cha)(cha)樹(shu)(shu)(shu)——(c); (4)左子(zi)(zi)樹(shu)(shu)(shu)為(wei)空的(de)二(er)(er)(er)叉(cha)(cha)(cha)樹(shu)(shu)(shu)——(d); (5)完全(quan)二(er)(er)(er)叉(cha)(cha)(cha)樹(shu)(shu)(shu)——(e)注(zhu)意:盡管二(er)(er)(er)叉(cha)(cha)(cha)樹(shu)(shu)(shu)與樹(shu)(shu)(shu)有(you)許多相似之(zhi)處,但二(er)(er)(er)叉(cha)(cha)(cha)樹(shu)(shu)(shu)不是樹(shu)(shu)(shu)的(de)特殊情形。
簡介
二(er)叉(cha)(cha)樹(shu)在中(zhong)是(shi)這(zhe)樣(yang)(yang)定義的(de):二(er)叉(cha)(cha)樹(shu)是(shi)一個(ge)連通的(de)無環圖,并且每一個(ge)頂(ding)點(dian)(dian)的(de)度(du)不大(da)于2。有(you)(you)根(gen)二(er)叉(cha)(cha)樹(shu)還要滿足根(gen)結(jie)(jie)點(dian)(dian)的(de)度(du)不大(da)于2。有(you)(you)了根(gen)結(jie)(jie)點(dian)(dian)之后(hou),每個(ge)頂(ding)點(dian)(dian)定義了唯一的(de)父結(jie)(jie)點(dian)(dian),和最多(duo)2個(ge)子(zi)結(jie)(jie)點(dian)(dian)。然而,沒有(you)(you)足夠的(de)信息(xi)來區(qu)分左(zuo)結(jie)(jie)點(dian)(dian)和右(you)結(jie)(jie)點(dian)(dian)。如(ru)果不考(kao)慮,允許圖中(zhong)有(you)(you)多(duo)個(ge),這(zhe)樣(yang)(yang)的(de)結(jie)(jie)構叫做森(sen)林。
在計算機科學中,二叉樹是每個結點最多有兩個子樹的有序樹。通常子樹的根被稱作“左子樹”(left subtree)和“右子樹”(right subtree)。二叉樹常被用作和二叉堆。二叉樹的每個結點至多只有二棵子樹(不存在度大于2的結點),二叉樹的子樹有左右之分,次序不能顛倒。二叉樹的第i層至多有2的 i 次方個結點;深度為k的二叉樹至多有2^(k) -1個結點;對任何一棵二叉樹T,如果其終端結點數(即葉子結點數)為n0,度為2的結點數為n2,則n0 = n2 + 1。
樹和二叉樹的2個主要差別:
1. 樹中(zhong)結(jie)點(dian)的最(zui)大(da)度數沒有限制,而(er)二(er)叉樹結(jie)點(dian)的最(zui)大(da)度數為2;
2. 樹的(de)結(jie)(jie)點無左、右(you)之分,而二叉樹的(de)結(jie)(jie)點有左、右(you)之分。……
樹(shu)(shu)是(shi)一種(zhong)重要的(de)(de)(de)非線(xian)性(xing),直觀(guan)地看,它是(shi)數據(ju)元素(在(zai)(zai)樹(shu)(shu)中(zhong)稱(cheng)為結(jie)點)按分支關(guan)系組(zu)(zu)織起來的(de)(de)(de)結(jie)構(gou),很象(xiang)自然界(jie)中(zhong)的(de)(de)(de)樹(shu)(shu)那(nei)樣(yang)。在(zai)(zai)客觀(guan)世界(jie)中(zhong)廣泛(fan)存在(zai)(zai),如人(ren)類社(she)會的(de)(de)(de)族(zu)譜和各種(zhong)社(she)會組(zu)(zu)織機(ji)構(gou)都(dou)可(ke)用(yong)(yong)樹(shu)(shu)形(xing)象(xiang)表(biao)(biao)示(shi)。樹(shu)(shu)在(zai)(zai)計算機(ji)領域中(zhong)也(ye)得到廣泛(fan)應用(yong)(yong),如在(zai)(zai)編譯源程序(xu)時,可(ke)用(yong)(yong)樹(shu)(shu)表(biao)(biao)示(shi)源程序(xu)的(de)(de)(de)語(yu)法結(jie)構(gou)。又如在(zai)(zai)中(zhong),樹(shu)(shu)型結(jie)構(gou)也(ye)是(shi)信息的(de)(de)(de)重要組(zu)(zu)織形(xing)式之(zhi)一。一切具有(you)層(ceng)次關(guan)系的(de)(de)(de)問題都(dou)可(ke)用(yong)(yong)樹(shu)(shu)來描述(shu)。
樹的概述
樹結構(gou)的特點是:它的每一(yi)個(ge)結點都可以(yi)(yi)有不(bu)止一(yi)個(ge)直接(jie)后繼,除根結點外的所有結點都有且只有一(yi)個(ge)直接(jie)前驅。以(yi)(yi)下(xia)具體(ti)地給出樹的定義及樹的數(shu)據結構(gou)表(biao)示。
圖示
樹的定義
樹是由一(yi)個或多個結點組成(cheng)的有限集合(he),其中:
⒈必(bi)有一個特定的(de)(de)稱(cheng)為根(ROOT)的(de)(de)結(jie)點(dian);
⒉剩(sheng)下(xia)的結(jie)點被分(fen)成n>=0個互不相交的集(ji)合T1、T2、......Tn,而且, 這些集(ji)合的每(mei)一個又都是樹(shu)。樹(shu)T1、T2、......Tn被稱作根的子樹(shu)(Subtree)。
樹的(de)定義如下:(1)至少有一個(ge)結點(稱(cheng)為根)(2)其它是互不相(xiang)交的(de)子樹
1.樹的(de)(de)度(du)(du)——也即是寬度(du)(du),簡單地(di)說,就是結(jie)(jie)點(dian)(dian)的(de)(de)分(fen)支數(shu)。以組成該樹各結(jie)(jie)點(dian)(dian)中最大的(de)(de)度(du)(du)作為(wei)(wei)該樹的(de)(de)度(du)(du),如上圖的(de)(de)樹,其(qi)度(du)(du)為(wei)(wei)3;樹中度(du)(du)為(wei)(wei)零(ling)的(de)(de)結(jie)(jie)點(dian)(dian)稱(cheng)(cheng)為(wei)(wei)葉結(jie)(jie)點(dian)(dian)或終(zhong)端(duan)結(jie)(jie)點(dian)(dian)。樹中度(du)(du)不為(wei)(wei)零(ling)的(de)(de)結(jie)(jie)點(dian)(dian)稱(cheng)(cheng)為(wei)(wei)分(fen)枝結(jie)(jie)點(dian)(dian)或非終(zhong)端(duan)結(jie)(jie)點(dian)(dian)。除根(gen)結(jie)(jie)點(dian)(dian)外的(de)(de)分(fen)枝結(jie)(jie)點(dian)(dian)統稱(cheng)(cheng)為(wei)(wei)內部結(jie)(jie)點(dian)(dian)。
2.樹的(de)深(shen)度(du)——組成(cheng)該樹各結(jie)點的(de)最大層次,如上圖,其深(shen)度(du)為3;
3.森林——指若(ruo)干棵(ke)互(hu)不相交的(de)樹的(de)集(ji)合,如(ru)上(shang)圖(tu),去(qu)掉根結點A,其原來的(de)二(er)棵(ke)子(zi)樹T1、T2、T3的(de)集(ji)合{T1,T2,T3}就為森林;
4.有(you)序樹(shu)(shu)——指樹(shu)(shu)中同層結點(dian)從(cong)左到右有(you)次序排列(lie),它們之間的次序不能互(hu)換(huan),這樣的樹(shu)(shu)稱為有(you)序樹(shu)(shu),否則稱為無序樹(shu)(shu)。
樹的表示
樹的表示方(fang)法(fa)有許(xu)多,常用(yong)(yong)的方(fang)法(fa)是用(yong)(yong)括號(hao):先(xian)將根(gen)結(jie)點(dian)放入一對圓括號(hao)中(zhong),然后把(ba)它(ta)的子(zi)(zi)樹由(you)左至右(you)的順序放入括號(hao)中(zhong),而對子(zi)(zi)樹也采用(yong)(yong)同樣的方(fang)法(fa)處理;同層(ceng)子(zi)(zi)樹與它(ta)的根(gen)結(jie)點(dian)用(yong)(yong)圓括號(hao)括起(qi)來(lai)(lai),同層(ceng)子(zi)(zi)樹之間用(yong)(yong)逗號(hao)隔開,最(zui)后用(yong)(yong)閉括號(hao)括起(qi)來(lai)(lai)。如上圖可寫(xie)成如下形式:
(A(B(E(K,L),F),C(G),D(H(M),I,J)))
二叉樹
1.二叉樹的基本形態
二叉樹也是遞歸定(ding)義的,其(qi)結(jie)點有(you)左右子樹之分(fen),邏(luo)輯(ji)上二叉樹有(you)五種基本形態:
(1)空二叉樹——(a);
(2)只有一(yi)個根結點的二(er)叉樹——(b);
(3)只有左子樹(shu)——(c);
(4)只有右子樹——(d);
(5)——(e)
注(zhu)意:盡(jin)管(guan)二叉樹與樹有許(xu)多相似(si)之(zhi)處,但二叉樹不(bu)是(shi)樹的特殊情形(xing)。
2.兩個重要的概念
(1)完(wan)全二(er)叉樹(shu)——若設(she)二(er)叉樹(shu)的(de)(de)高度為h,除第 h 層(ceng)(ceng)外(wai),其它各層(ceng)(ceng) (1~h-1) 的(de)(de)結點數都達到最大個數,第 h 層(ceng)(ceng)有葉子節點,這就是完(wan)全二(er)叉樹(shu)。
(2)——除(chu)了葉結(jie)點(dian)外(wai)每一個(ge)結(jie)點(dian)都有左(zuo)右子(zi)葉且(qie)葉結(jie)點(dian)都處在最(zui)底層的(de)二叉樹(shu),。
3.二叉樹的性質
(1) 在二叉樹中,第i層(ceng)的結點總數不(bu)超過2^(i-1);
(2) 深度為h的二(er)叉樹最多有(2^h)-1個結點(dian)(h>=1),最少有h個結點(dian);
(3) 對于任(ren)意(yi)一棵二叉(cha)樹,如果(guo)其葉結點數(shu)為N0,而度數(shu)為2的結點總數(shu)為N2,
則N0=N2+1;
(4) 具有n個結點(dian)的(de)完全二叉樹(shu)的(de)深(shen)度為int(log2n)+1
(5)有N個(ge)結(jie)點(dian)的完全二叉(cha)樹各結(jie)點(dian)如果(guo)用順序方(fang)式(shi)存(cun)儲,則結(jie)點(dian)之間有如下(xia)關系:
若(ruo)I為(wei)(wei)結點(dian)編號則 如果I<>1,則其(qi)父(fu)結點(dian)的編號為(wei)(wei)I/2;
如(ru)果2*I<=N,則其左(zuo)兒(er)子(zi)(即左(zuo)子(zi)樹(shu)的根結(jie)點)的編(bian)號為(wei)2*I;若2*I>N,則無左(zuo)兒(er)子(zi);
如果2*I+1<=N,則其右兒子的結點編號(hao)為2*I+1;若2*I+1>N,則無(wu)右兒子。
(6)給定(ding)N個節(jie)點,能構成h(N)種不同(tong)的(de)二叉樹。
h(N)為的第N項。h(n)=C(n,2*n)/(n+1)。
4.二叉樹的存儲結構
(1)順序存儲方式
type node=record
data:datatype
l,r:integer;
end;
var tr:array[1..n] of node;
(2)存儲方式(shi),如:
type btree=^node;
node=record
data:datatye;
lchild,rchild:btree;
end;
5.普通樹轉換成二叉樹
二叉樹(shu)(shu)很象一株(zhu)倒(dao)懸著的(de)(de)(de)樹(shu)(shu),從樹(shu)(shu)根到大(da)分(fen)枝(zhi)、小分(fen)枝(zhi)、直到葉(xie)子(zi)(zi)(zi)把數據聯系(xi)起(qi)來,這種(zhong)數據結(jie)(jie)(jie)(jie)構就(jiu)叫做樹(shu)(shu)結(jie)(jie)(jie)(jie)構,簡稱(cheng)(cheng)(cheng)樹(shu)(shu)。樹(shu)(shu)中(zhong)每個(ge)分(fen)叉點(dian)(dian)(dian)(dian)(dian)稱(cheng)(cheng)(cheng)為結(jie)(jie)(jie)(jie)點(dian)(dian)(dian)(dian)(dian),起(qi)始結(jie)(jie)(jie)(jie)點(dian)(dian)(dian)(dian)(dian)稱(cheng)(cheng)(cheng)為樹(shu)(shu)根,任意兩個(ge)結(jie)(jie)(jie)(jie)點(dian)(dian)(dian)(dian)(dian)間的(de)(de)(de)連接(jie)關(guan)系(xi)稱(cheng)(cheng)(cheng)為樹(shu)(shu)枝(zhi),結(jie)(jie)(jie)(jie)點(dian)(dian)(dian)(dian)(dian)下(xia)面(mian)不再(zai)有分(fen)枝(zhi)稱(cheng)(cheng)(cheng)為樹(shu)(shu)葉(xie)。結(jie)(jie)(jie)(jie)點(dian)(dian)(dian)(dian)(dian)的(de)(de)(de)前趨(qu)(qu)結(jie)(jie)(jie)(jie)點(dian)(dian)(dian)(dian)(dian)稱(cheng)(cheng)(cheng)為該(gai)結(jie)(jie)(jie)(jie)點(dian)(dian)(dian)(dian)(dian)的(de)(de)(de)"雙親",結(jie)(jie)(jie)(jie)點(dian)(dian)(dian)(dian)(dian)的(de)(de)(de)后趨(qu)(qu)結(jie)(jie)(jie)(jie)點(dian)(dian)(dian)(dian)(dian)稱(cheng)(cheng)(cheng)為該(gai)結(jie)(jie)(jie)(jie)點(dian)(dian)(dian)(dian)(dian)的(de)(de)(de)"子(zi)(zi)(zi)女"或" 孩子(zi)(zi)(zi)",同一結(jie)(jie)(jie)(jie)點(dian)(dian)(dian)(dian)(dian)的(de)(de)(de)"子(zi)(zi)(zi)女"之間互稱(cheng)(cheng)(cheng)"兄弟"。
普通(tong)樹轉二叉樹,一般(ban)采用左“子女”右“兄弟”的(de)方式(shi)來轉化。
完全二叉樹
對滿(man)二叉(cha)樹(shu),從(cong)第一(yi)層的(de)結點(dian)(即根)開始,由(you)下而上,由(you)左及右,按順序(xu)結點(dian)編(bian)號,便(bian)得到滿(man)二叉(cha)樹(shu)的(de)一(yi)個順序(xu)表(biao)示。據此編(bian)號,完(wan)全(quan)二叉(cha)樹(shu)定義如下:一(yi)棵具有(you)n個結點(dian),深度為(wei)K的(de)二叉(cha)樹(shu),當且僅當所有(you)結點(dian)對應(ying)于深度為(wei)K的(de)滿(man)二叉(cha)樹(shu)中編(bian)號由(you)1至(zhi)n的(de)那(nei)些結點(dian)時,該二叉(cha)樹(shu)便(bian)是完(wan)全(quan)二叉(cha)樹(shu)。圖4是一(yi)棵完(wan)全(quan)二叉(cha)樹(shu)。
二叉樹遍歷
遍(bian)歷(li)是(shi)(shi)對樹(shu)(shu)的(de)一(yi)(yi)種最基(ji)本的(de)運算,所(suo)(suo)謂遍(bian)歷(li)二叉樹(shu)(shu),就是(shi)(shi)按一(yi)(yi)定的(de)規(gui)則和(he)順(shun)序(xu)走遍(bian)二叉樹(shu)(shu)的(de)所(suo)(suo)有結點(dian),使(shi)每一(yi)(yi)個(ge)(ge)結點(dian)都被訪問(wen)一(yi)(yi)次(ci),而且(qie)只被訪問(wen)一(yi)(yi)次(ci)。由于(yu)二叉樹(shu)(shu)是(shi)(shi)非線性結構,因(yin)此,樹(shu)(shu)的(de)遍(bian)歷(li)實質上是(shi)(shi)將二叉樹(shu)(shu)的(de)各個(ge)(ge)結點(dian)轉換成為一(yi)(yi)個(ge)(ge)線性序(xu)列來(lai)表示。
設L、D、R分別表(biao)示遍(bian)歷左子樹(shu)、訪(fang)問根(gen)結點(dian)和遍(bian)歷右子樹(shu), 則對一棵二叉樹(shu)的遍(bian)歷有(you)三種情況(kuang):DLR(稱(cheng)為先根(gen)次序遍(bian)歷),LDR(稱(cheng)為中根(gen)次序遍(bian)歷),LRD (稱(cheng)為后根(gen)次序遍(bian)歷)。
(1)
訪(fang)問根(gen);按前序(xu)遍歷左(zuo)子(zi)樹;按前序(xu)遍歷右子(zi)樹
(2)
按中序(xu)遍歷左子(zi)樹(shu);訪(fang)問根;按中序(xu)遍歷右子(zi)樹(shu)
(3)
按后序(xu)遍歷左子樹(shu)(shu);按后序(xu)遍歷右子樹(shu)(shu);訪問根
(4)層次遍歷
即(ji)按照層(ceng)次訪(fang)問(wen),通常用(yong)來做。訪(fang)問(wen)根,訪(fang)問(wen)子女(nv),再訪(fang)問(wen)子女(nv)的子女(nv)(越往后的層(ceng)次越低)(兩(liang)個子女(nv)的級別相同(tong))
特殊的二叉樹
1. 完全二叉樹
Complete Binary Tree
若(ruo)設二叉樹(shu)(shu)的高度(du)為(wei)h,除第 h 層外(wai),其它各層 (1~h-1) 的結(jie)點數都達到(dao)最大個數,第 h 層從右向左(zuo)連續缺(que)若(ruo)干結(jie)點,這就是完全二叉樹(shu)(shu)。
2. 滿二叉樹
Full Binary Tree:
一個(ge)高度為(wei)h的二(er)叉樹包含正(zheng)是2^h-1元素稱為(wei)滿二(er)叉樹。