考研数据结构chpt6_第1页
考研数据结构chpt6_第2页
考研数据结构chpt6_第3页
考研数据结构chpt6_第4页
考研数据结构chpt6_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第六章 树和二叉树止一个直接前驱或后继(树,图等)数据结构:线性结构(线性E表va,l栈ua,t队io列n

o等nl)y.ated•wi非th线A性sp结os构e.:Sl至id少es存f在or一.N个ET数3.据5

元Cl素ie有nt不ProfiCopyright

2004-2011

Aspose

Pty

Ltd.第六章 树和二叉树§6.1树的定义树是n个数据元Ev素al的ua有ti限on集o(n记l记y.为T),对ate任dw意it一h棵As树poTs有e.:Slidesfor.NET3.5ClientProfi⒈ 存在唯Co一py一ri个gh称t2为00根4-2的01数1A据sp元os素e;PtyLtd.⒉当n>1时,其它数据元素可分为m(m>0)个互不相交的有限集T1,T2,…,Tm,其中每个集合Ti(i=1,2,…,m)本身又是一棵树,并称树Ti是根的子树.第六章 树和二叉树B

CD2.

嵌套集合表示法ACBD树的表示法1.

分支图表示法EvaluatiAon

only.3.广义表表示法(A(B(D),C))ated

with

Aspose.Slides

for

.NET

3.5

Client

ProfiCopyright

2004-2011

Aspose

Pty

Ltd.第六章 树和二叉树树的基本术语树的结点:包含一个DE和指向其子树的所有分支;结点的度:一个结点拥有的子树的个数,度为零的结点称为叶结点;

Evaluation

only.ate3d.w树it的h

度As:p树os中e.所S有li结de点s

的fo度r

的.N最ET大3值.5MaCaxl(iDe(nIt))Profi含义:C树op中yr最i大gh分t

支2支0数04为-2树01的1度As;pose

Pty

Ltd.4.

结点的层次及树的深度:根为第一层,根的孩子为第二层,若某结点为第k层,则其孩子为k+1层.树中结点的最大层次称为树的深度或高度

5.森林:是m(m>=0)棵互不相的树的集合森林与树概念相近,相互很容易转换.第六章 树和二叉树§6.2 树的基本运算⒈ 初始化操作INITEIvAaTlEu(aTt)i:o创no建nl一y棵.空树。ated⒉wit求h根As函po数sReRO.OSTl(iTd)e:s求fo树rT.的NE根T;3.R5OOCTl(iXe)n:t求Profi结点x所在Co树py的ri根g。ht2004-2011AsposePtyLtd.⒊ 求双亲函数PARENT(T,x):在树T中求x的双亲。⒋ 求第i个孩子函数CHILD(T,x,i):在树T中求结点x的第i个孩子。⒌ 求兄弟函数:在T中求x的左兄弟LSIBLING(T,x);在树T中求x的右兄弟RSIBLING(T,x)。第六章 树和二叉树第i根子树。⒏ 删除子树操作DEL-CHILD(x,i):删除x的第i棵子树。⒐ 遍历树操作TRAVERSE(T):按顺序访问树T中各个结点。⒑ 置空树操作CLEAR(T):将树T置为空树。⒍ 建树函数CRT-TREE(x,F):建立以结点x为根,森林F为子树的树。Evaluationonly.ated⒎wit插h入As子po树se操.作SlIiNdSe-sCHfIoLrD(.yN,EiT,x3).:5将Clxi作en为tyP的rofiCopyright

2004-2011

Aspose

Pty

Ltd.第六章 树和二叉树§6.3 二叉树概念及性质一. 二叉树概念 Evaluationonly.atedwit二hA叉sp树os是e.结Sl点id数es为fo0r或.每NE个T3结.5点Cl最ie多nt只P有rofi左右两棵Co子py树ri的gh树t2。00二4-叉20树11是A一s一po种se特P殊ty的Lt树d.,它的特点是:⑴每个结点最多只有两棵子树,即不存结点度大于2的结点;⑵子树有左右之分,不能颠倒。6.3

二叉树二. 二叉树性质性质1. 在二叉树的第Evia层lu上a至ti多on有o2nil-1y个.结点(i≥1)。ate性dw质i2t2.hA深s度p度o为sek.的Sl二id叉e树sf至o多r多.有NE2Tk-31.个5结Cl点ie(nkt≥P)r。ofi(深度一C定o,py二ri叉gh树t的20最04大-2结0点11数A也sp确os定e)PtyLtd.性质3. 二叉树中,终端结点数n0与度为2的结点数n2有如下关系: n0=n2+16.3

二叉树12374K=3n=23-1=75

6满二叉树满二叉树:深度为k,且有2k-1个结点的二叉树。特点:(1)每一层上结点数都达到最大(2)度为1的E结va点lnu1a=t0iononly.atedwi结t点hA层sp序o编se号.S方li法de:s从fo根r结.N点ET起3从.5上C到li下en逐t层Profi(层内从C左op到y右ri)gh对t二20叉04树-2的0结1结1点As进p行os连e续P续t编yL号t。d.6.3

二叉树45完全二叉树:深度为k,结点数为n的二叉树,当且仅当每个结点的编Ev号al都ua与t相io同no深n度ly的.满二叉树ated中wi从th1到Asnp的os结e点.S一li一de对s应fo时r,.N称ET为3完.5全C二li叉en树t。ProfiCopyright2004-2011AsposePtyLtd.12 36.3

二叉树45完全二叉树的特点:每个结点i的左子树的深度Lhi-其结点i的右子树的深度Rhi等于E0v或a1l1,ua即ti叶on结o点nl只y.可能出现在ated层wi次th最A大sp或os次e最.S大li的de两s层fo上r。.NET3.5ClientProfi完C全op二y叉r叉i树gh结t点20数04n-满20足121k-A1s-p1<o<sne≤P2tky-1Ltd.满二叉树一定是完全二叉树,反之不成立。12 36.3

二叉树2LH

=03265411LH

=3RH

=11LH

-RH1=21Evaluation

only.ateRdHw2=i1th

As2pose.3Slides

for

.NET

3.5

Cli1ent

ProfiCopyright

2004-42011

A非完全二叉树非完全二叉树LH2-RH2=0-1=-1spose

Pty

Ltd.6.3

二叉树性质4. 结点数为n的完全二叉树,其深度为log2n┘+ 1Evaluationonly.└ated

with

Aspose.Slides

for

.NET

3.5

Client

ProfiCopyright

2004-2011

Aspose

Pty

Ltd.6.3

二叉树性质5. 在按层序编号的n个结点的完全二叉树中,任意一结点i(1≤i≤Env)a有lu:ationonly.双亲为结点└i/2┘。⑵ 2i>n时,结点i无左孩子,为叶结点;否则,结点i的左孩子为结点2i。⑶ 2i+1>n时,结点i无右孩子;否则,结点i的右孩子为结点2i+1。ated⑴witih=1A时sp,os结e点.Sil是id树es的f根or;.否NE则T(3i.>51)C,li结en点tiP的rofiCopyright

2004-2011

Aspose

Pty

Ltd.6.3

二叉树完全二叉树DCGFEBA三、二叉树的存储结构⒈ 顺序存储结构用一组地址连续的存储单元,以层序顺序存放二叉树bt[3]的双亲为└3/2┘=1,即在bt[1]中;其左孩子在bt[2i]=bt[6]中;其右孩子在bt[2i+1]=bt[7]中。A

B

C

D

E

F

G

0

0

0

0的数据元素,结点的相对Ev位a置lu蕴a含t含i着on结o点n之ly间.的关系。atedwithAspose.Slidesfor.NET3.5ClientProfiCopyright2004-12201314A5s6p7o8se91P01t1yLtd.6.3

二叉树这种存储结构适合于完全二叉树,既不浪费存储空间,又能很快确定结点的存放位置、以及结点的双亲和左右孩子的存放位置,但对一般二叉树,可能造成存储空间的浪费。D二叉树FB

CAA

B

C

D

E

0

0

0

0

F

G

0

0

0

0Ev1a2lu3a4ti5

o6

n7

o8

n9l10y1.1一般二叉树也按完全二叉树形式存储,没结点处用0表示。ated

with

Aspose.Slides

for

.NET

3.5

Client

ProfiCEopyright

2004-2011

Aspose

Pty

Ltd.G6.3

二叉树例如,深度为k,且只有k个结点的右单枝树(每个非叶结点只有右孩子)E,va需lu2ka-t1i个on单o元nl,y.即有2k-1-atekd个w单it元h被As浪po费s。e.Slidesfor.NET3.5ClientProfiCopyright12004-2011AsposePtyLtd.k6.3

二叉树⒉ 链式存储结构设计不同的结点E结va构lu,a可t可i以on构o成nl不y.同的链式存ated储w结it构h。As常po用se的.有Sl:idesfor.NET3.5ClientProfi二叉链C表opyright2004-2011AsposePtyLtd.三叉链表线索链表 用空链域存放指向前驱或后继的线索6.3

二叉树D二叉树CEBACBDE∧∧

∧∧∧∧二叉链表

A二叉链表的结点结构Evaluation

only.ated

with

Aslcphoislde.Sldiadtesa

forrch.ilNdET

3.5

Client

ProfiCopyright

2004-2011

Aspose

Pty

Ltd.6.3

二叉树三叉链表的结点结构lchild

data

parent

rchildD二叉树CEBAACBDE∧∧

∧∧∧∧∧三叉链表Evaluation

only.ated

with

Aspose.Slides

for

.NET

3.5

Client

ProfiCopyright

2004-2011

Aspose

Pty

Ltd.6.3

二叉树性质6. 含有n个结点的二叉链表中,有n+1个空链域。Evaluationonly.atedwithAspose.Slidesfor.NET3.5ClientProfiCopyright2004-2011AsposePtyLtd.6.4

遍历二叉树和线索二叉树一、遍历二叉树遍历二叉树是指按一定的规律对二叉树的每个结点,访问且仅访问一次的处理过程。访问是一种抽象操作Ev,al是ua对ti结o点no的nl某y种.处理,例如ate可d以wi是th求A结sp点os的e.度S、l、i或de层s次fo、r打.打N印ET结3点.5的C信l信i息en,t或Pr做ofi其他任何工Co作py。right2004-2011AsposePtyLtd.一次遍历后,使树中结点的非线性排列,按访问的先后顺序变为某种线性排列。遍历的次序:若设二叉树根为D,左子树为L,右子树为R,并限定先左后右,则有以下三种遍历次序:LDR 中序遍历;LRD 后序遍历;DLR 先序遍历6.4

遍历二叉树和线索二叉树1.中序遍历二叉树算法思想:若二叉树非空,则:访问根结点中序遍历右子树算法描述:PROCinorder(bt:bitreptr);[inorder(bt↑.lchild);visit(bt↑.data);inorder(bt↑.rchild);]ENDP;

{inorder}Evaluation

only.ated

with

Aspose.Slides{bfto为r

B.TN根ET结3点.5指C针li}ent

Profi1)中序遍C历op左yr子ig树ht

20I0F4-b2t0<1>N1IALsTpHoEsNe

Pty

Ltd.6.4

遍历二叉树和线索二叉树2.后序遍历二叉树算法思想:后序遍历右子树访问根结点IFbt<>NILTHEN[postorder(bt↑.lchild);postorder(bt↑.rchild);visit(bt↑.data);]ENDP;{postorder}Ev算al法ua描ti述o:n

only.ate若d二wi叉th树A非sp空os,e.则S:l:idePsROfCopro.sNtoErTde3r.5(bCtl:ibeinttrePprtorf)i;1)后序遍C历op左yr子ig树ht

2{0b0t4为-2B0T1根1结As点p指os针e

}Pty

Ltd.6.4

遍历二叉树和线索二叉树3.先序遍历二叉树算法思想:2)

先序遍历左子树3)先序遍历右子树IFbt<>NILTHEN[visit(bt↑.data);preorder(bt↑.lchild);preorder(bt↑.rchild);]ENDP;{preorder}Ev算al法ua描ti述o:n

only.ate若d二wi叉th树A非sp空os,e.则S:l:idePsROfCoprr.eNoErdTe3r.(5btC:libeinttrePprtorf)i1)访问根C结op点yright

2{0b0t4为-2B0T1根1结As点po指s针e针P}ty

Ltd.6.4

遍历二叉树和线索二叉树cdb

-a

×

e

f例:表达式 a+b×(c-d)-e/fEvaluationonly.atedwithAsp-ose.Slidesf遍or历.N结E果T3:.5ClientProfi++Copyr/ight2004中-2序01:1aA+sbp×osce-Ptdy-Lted.//f后序:abcd-×+ef/-先序:-+a×b-cd/ef6.4

遍历二叉树和线索二叉树三种遍历过程示意图例acb×—b-ba

a-—aba

b虚线表示执行过程:向下表示更深层的递归调用;向上表示递归调用返回;沿虚线记下各类符号,便得到遍历的结果.Evaluation

only-.ated

with

Aspose.Slide*s

for

.×NET

3*.5cClienct

ProfciCopyright

2004-20*11

Aspose

PtycLtd.6.4 遍历二叉树和线索二叉树PROC

inorder(bt:bitreptr);{中序遍历非递归算法,s为存储二叉树结点指针栈}

INISTACK(s);push(s,bt);[

WHILE

GETTOP(s)<>NIL

DOIF

NOT

EMPTY(s)

THEN[

visit(GETTOP(s)↑.data);p:=POP(s);PUSH(s,

p↑.rchild)]]ENDP;{inorder}左结点紧跟根后面一次和出一次栈,并且总是访问栈顶元素,因此,算法正确,时间复杂度为O(n)。WHILE NOTEMPTY(sE)vDaOluationonly•.根结点先进栈,ated

with

Aspose.Slides

for

.NET

3.进5

栈Cl,i右e结nt点P在r根ofiPUSCHo(sp,yGrEiTgThOPt(2s)0↑04.-l2c0hi1l1d)A;spo出s栈e

后Pt入y栈Ltd.p:=POP(s);每个结点都要进6.4

遍历二叉树和线索二叉树二、线索二叉树⒈ 问题的提出:通Ev过al遍ua历ti二on叉o树n树ly可.得到结点ate的dw一it个h线As性po序se列.S,li在d在es线f性or序.N列ET中3,.5就Cl存ie在nt结Pr点ofi和前驱和C后op继yr,ig但ht是20在04二-2叉01树1A上sp只os能e找Pt到yL结td点.的左孩子、右孩子,结点的前驱和后继只有在遍历过程中才能得到,那么,能否通过结点的两个链域查找出任一结点的前驱和后继?6.4

遍历二叉树和线索二叉树2. 分析:n个结点有n-1个Ev前al驱ua和tino-n-1o个nl后y.继;atedwithAspose.Slidesfor.NET3.5ClientProfi一共C有op2ynr个ig链ht域2,0,04其-2中01:1nA+s1p个os空eP链ty域Lt,d.n-1个指针域;因此, 必须用空链域来存放结点的前驱和后继。线索二叉树就是利用n+1个空链域来存放结点的前驱和后继结点的信息。6.4 遍历二叉树和线索二叉树lchild

ltag

data

rtag

rchild3. 线索二叉树:⑴ 结点结构在二叉链表中增加 ltag 和 rtag 两个标志域Evaluationonly.若结点有左子树,则左链域lchild指示其左孩子(ltag=0);否则,令左链域指示其前驱(ltag=1);若结点有右子树,则右链域rchild指示其右孩子(rtag=0);否则,令右链域指示其后继(rtag=1);ated

with

Aspose.Slides

for

.NET

3.5

Client

ProfiCopyright

2004-2011

Aspose

Pty

Ltd.6.4 遍历二叉树和线索二叉树的过程称为线索化。按中序遍历得到的线索二叉树称为中序线索二叉树;按先序遍历得到的线索二叉树称为先序线索二叉树;按后序遍历得到的线索二叉树称为后序线索二叉树;称这种结点结构为线索链表;其中指示前驱和后E继va的lu链a域ti称on为o线nl索y.;ated•w加it上h线As索p的o的s二e.叉Sl树id称e为s为f线or索.二NE叉T树3.;5

Client

Profi对二叉C树o以p以y某ri种gh次t序20遍04历-2使0其11变A为s为p线os索e

二Pt叉y

树L树td.6.4 遍历二叉树和线索二叉树acb×—0

01

c

10

×

01

b

11

a

1(2)整体结构增设一个头结点,令其lchild指向二叉树的根结点,ltag=0、rtag=1;并将该结点作为遍Ev历a访lu问at的io第n一on个ly结.点的前驱ated和wi最t后hA一s个po结se点.S的li后d继es;for.NET3.5ClientProfi最后用C头op指yr针ig指ht示2该00头4结-2点01。1Aspo0sePt1yLtd.6.4 遍历二叉树和线索二叉树4. 遍历线索二叉树:有了线索二叉树,就容易遍历二叉树了.Evaluationonly.ated只w要ithAspose.Slidesfor.NET3.5ClientProfi(1)先Co找py要ri遍gh历t2的00第4-一20个11结A点sp;osePtyLtd.(2)然后依次找结点的后继;(3)重复(2)直到其后继为头结点.所有问题归为如何在线索二叉树中找结点的后继?6.4 遍历二叉树和线索二叉树1)遍历中序线索二叉树(1)中序线索二叉树Ev中al,ua找t结io点n的on后ly继.算法ated算w法it思h想As:po对s任e.意Sl结id点epsp,fo若rr.tNaEgT=13,.5则CrlciheinldtdProfi指向该结C点op的y后ri继gh;t若20r0t4a-g2=00,1,1则Asrcphoisled指P指t向yL该td.结点的右孩子,此时,应从右孩子开始,沿左指针前进,直到找到没有左孩子的结点s(ltag=1),则s就是p的后继,即后继是中序遍历右子树时,访问的第一个结点;6.4 遍历二叉树和线索二叉树中序线索二叉树中,找结点的后继算法FUNC in_next(p,thrEtv:atlhulaintkitopn):otnhllyin.ktp;结点的后继}s:=p↑.rchild;IF

p↑.rtag=0

THENWHILE

s↑.ltag=0

DOs:=

s↑.lchild;RETURN(s)ENDIF;{in_next}p1spated{w在i以ththArst为po头s指e.针S的li中d序es线f索o二r

叉.N树E上T

,3查.5找C指l针iep所nt指Profi010sCopyright

2004-2011

Aspose

Pty

Ltd.6.4 遍历二叉树和线索二叉树(2)遍历中序线索二叉树算法PROC

thrt_inorder(thrt:thlinktp);{遍历以thrt为头指针的中序线索二叉树}p↑.ltag=0Evaluation

only.ated

wipt:=htAhsrtp↑os.el.cShillidd;es

for

.NET

3.5

Client

ProfiWHILECpo↑py.rlicghihltd<2>0t0h4r-t2D0O11p:A=sppo↑s.elPchtiylLd;td.{定位要遍历的第一个结点.}WHILE

p<>thrt

DO

[

visit(p↑.data);p:=in_next(p,thrt)]ENDP;{thrt_inorder}6.4 遍历二叉树和线索二叉树2)遍历后序线索二叉树(1)后序线索二叉树中,找结点的后继算法若p是双亲的右孩子、或是独生左孩子,则后继为双亲;若p是有兄弟的左孩子,则后继为双亲的右子树上按后序遍历时,访问的第一个结点(叶结点);spspssEvaluation

onlpy.ated算w法it思h想As:po对se任.意Sl结id点esp,for.NET3.5ClientProfi若p为二Co叉py树r的ig根ht,2则00无4-后20继1;1;AsposePtyLtd.6.4 遍历二叉树和线索二叉树后序线索二叉树中,找结点的后继算法FUNC post_next(p,thrt:thlinktp):thlinktp;{在以thrt为头指针的后序线索二叉树上,查找指针p所指结点的后继

}Evaluation

only.atedwist:=hpAasrepnots(et.hSrlti,dep)s;fo{r在.tNhrEtT上3查.5找Cp的li双e亲n亲t}ProfiIFs=CthorptyrTiHEgNhtRE2T0U0R4N-(t2h0r1t1);AsposePtyLtd.IF s↑.rchild=pORs↑.rtag=1THEN RETURN(s);WHILE s↑.rtag=0DO[s:=s↑.rchild;WHILE s↑.ltag=0DO s:=s↑.lchild;]RETURN(s)ENDIF;{post_next}6.4 遍历二叉树和线索二叉树(2)遍历后序线索二叉树算法PROC

thrt_postorder(thrt:thlinktp);{遍历以thrt为头指针的后序线索二叉树}IF

thrt<>thrt↑.ElvcahliuladtTiHoEnN

only.ated

wit[hpA:s=tphorste↑.S.llcihdielsd;forse.aNrcEhT:3=t.r5ueC;lient

ProfiWHCILoLEpysreiagrhcht

2DO0O04-2011

Aspose

Pty

Ltd.[

WHILE

p↑.ltag=0

DO

p:=

p↑.lchild;IF

p↑.rtag=0

THEN

p:=

p↑.rchildELSE

search:=false;]WHILE

p<>thrt

DO

[

visit(p↑.data);p:=post_next(p,thrt)]]ENDP;{thrt_postorder}6.4 遍历二叉树和线索二叉树3)遍历先序线索二叉树先序线索二叉E树va中lu,at找i结on点o的nl后y.继算法ated算wi法th思A想sp:os对e任.S意li结de点spf:or.NET3.5ClientProfi若p有C左op孩y子ri,gh则t后20继04为-2左0孩1孩1子As;posePtyLtd.若p无左孩子,有右孩子,则后继为右孩子;若p无左孩子,也无右孩子,则后继为右线索;6.4 遍历二叉树和线索二叉树先序线索二叉树中,找结点的后继算法FUNC pre_next(p,thErvta:ltuhalitnikotnp)o:ntlhyli.nktp;ated{w在i以t以hthArstp为o头se指.针Sl的i先d先e序s线fo索r二.叉NE树T上3,.查5找Cl指i针enpt所P指rofi结点的后C继op}yright2004-2011AsposePtyLtd.IF p↑.ltag=0THEN RETURN(p↑.lchild);ELSE RETURN(p↑.rchild)ENDIF;{pre_next}6.4 遍历二叉树和线索二叉树(2)遍历先序线索二叉树算法PROC

thrt_preorderE(vtahlruta:tthiloinnkotnpl)y;.ated{w遍i历t历h以Atshprto为se头.指Sl针i的d的e先s序fo线r索.二NE叉T树3}.5

Client

Profip:=thCrto↑py.rlicghihltd;2004-2011

Aspose

Pty

Ltd.WHILE

p<>thrt

DO

[

visit(p↑.data);p:=pre_next(p,thrt)]ENDP;{thrt_preorder}6.5树和森林一.树的存储结构1.双亲表示法432651123456data

parent011222用一组地址连续的存储单元来存放树的结点,每个结点有两个域:Evaluationonly.atedwidtahtaAa域sp-o-s-e-.-S存li放d结es点f的or信.N息E;T3.5ClientProfiparenCto域py-r-i-g-h-t存2放00该4结-2点01双1亲As结po点se的P位ty置L.td.特点:求结点的双亲很容易,但求结点的孩子需要遍历整个向量。6.5

树和森林2.孩子表示法每个结点的孩子用单链表存储,称为孩子链表。n个结点可以有n个孩子链表(叶结点的孩子链表为空表)。如图:12345663524∧∧∧∧∧∧特点:与1相反,求孩子易,求双亲难。Evaluation

only.ated

wint个h

孩A孩s子po链se表.S的l头i头d指es针f用or一.个N个E向T

3量.表5

C示l。i。ent

Profi头C头o指py针ri向gh量t

2004-20孩11子A链sp表ose

Pty

Ltd.6.5

树和森林3.双亲孩子表示法.在孩子表示法的头指针向量中,增加一项,用来如图: 头指针向量 孩子链表01122212345663524∧∧∧∧∧∧表示该结点的双亲。Evaluation

only.ated

with

Aspose.Slides

for

.NET

3.5

Client

ProfiCopyright

2004-2011

Aspose

Pty

Ltd.6.5

树和森林4.孩子兄弟表示法.用二叉链表作为树的存储结构,每个结点的左链域指向该结点的第一个孩子,右链域指向下一个兄弟结点。如图:∧∧∧∧123456∧∧∧双亲只管长子长子连接兄弟Evaluation

only.ated

with

Aspose.Slides

for

.NET

3.5

Client

ProfiCopyright

2004-2011

Aspose

Pty

Ltd.6.5

树和森林二、森林、树与二叉树的对应关系Evaluationonly.atedw1it、h树As与po二s叉e.树Sl的id对es应f关or系.NET3.5ClientProfi树C与op二y叉ri树gh均t可20用04二-2叉0链11表As作p为os存eP储t结yL构t,d.因此给定一棵树,用二叉链表存储,可唯一对应一棵二叉树,反之亦然。AB

E∧

BC∧∧

E∧A∧∧

DDECbA∧

BC∧

∧∧

E树DEvaluation

only.a(t1ed)w孩i子th兄A弟sp法ose.Slides

for

.NET

3.5

Client

ProfiCopyrigh(t22)00顺4时-2针0转114A5s度pose

PtyALt∧d.解释:B是A的第一个孩子,C.E是B的兄弟,D是C的第一个孩子。解释:B是A的左孩子,C是B的右孩子。6.5

树和森林树变为二叉树的方法(1)在兄弟之间加一连线;(2)对每一个结点,只保留它与第一个孩子的Evaluation

only.ated

with

Aspose.Slides

for

.NET

3.5

Client

Profi连线,去Co掉py与r其ig他ht孩2子00的4-连20线1;1;AsposePtyLtd.(3)以树根为轴心,将整棵树顺时针旋转45度。特点:根无右子树6.5

树和森林2.森林与二叉树的对应关系森林转换为二叉E树va的lu方at法iononly.ate•d将wi森th林AsFp=o{sTe1,.TS2l.i.d.eTsm}f的o各r.棵NE树T分3.别5转Cl成ie二n叉tP树rofiBT1,BT2..C.oBpTymright2004-2011AsposePtyLtd.将BTi+1作为BTi根结点的右子树(i=1,2,...,m-1),得到一棵BT。6.5

树和森林如图:F={T1,T2,T3}DBCABT1

BT2FEEAH

IGT1T2

T3BT3HJIJIFEG

BDHGCEvaluation

only.ateBd

wiCth

AsDpose.SlFides

for

.NETJ3.5

Client

ProfiCopyright

2004-2011

Aspose

PAty

Ltd.6.5

树和森林JIHGFBCDA1BCDAFE

ET23JIHG(2)二叉树转换森林的方法将当前根结点和其左子树作为森林的一棵树,并将其右子树作为森林的其他子树;Evaluation

only.ated

•wi重t复h

A上s面p面o直se到.S某li结d点e点s的fo右r子.N树E为T为3空.5。Client

ProfiCopyrightT2004-2011

Aspose

TPty

Ltd.6.6

哈夫曼树及其应用哈夫曼树(Huffman)树是一类带权路径长度最短的树一、Huffman树(最优二叉树)1.概念2763415例⑴-⑵-⑸为结点1到5之间的路径,其路长度为2,树的路径长度=l12+l13+l14+l15+l16+l17=1+1+2+2+2+2=10Evaluation

only.ated•w两it结h点As间p的os路e径.S:l从id一e结s点f点o到r另.N一E结T点3.所5经C过li的e结n结t点P序ro列fi路径长C度o:py路r径ig上h的t分20支0树4树-2011AsposePtyLtd.树的路径长度:从根到每一结点的路径长度之和6.6

哈夫曼树及其应用长度为树中所有叶结点的权值与路径长度的乘积的总和。完全二叉树是路径长度最短的二叉树。考虑带权时:E设v树al中ua有timo个n叶on结ly点.,每个atedw叶it结h点As带po一s个e.权Sl值idweis且f根or到.叶NE结T点3.i5的C路li径en长tProfi度为LiC(oipy=r1i,g2h,t2.0.04-m2)0,11则A树sp的os带e权Pt路y径Ltd.M即:WPL=∑WkLkK=16.6

哈夫曼树及其应用例:使WPL最小的二叉树成为最优二叉树(Huffman树)dca7b5

2

4d4a7b5WPLa=2*7+2*5+2*2+2*4=36WPLb=7*3+5*3+2*1+4*2=46完全二E叉va树luation

only.ated

with

Aspose.Slides

for

.NET

3.5

Clicent

ProfiCopyright

2004-2011

Aspose

P2ty

Ltd.6.6

哈夫曼树及其应用Huffman树WPLc=7*1+5*2+2*3+4*3=35ba5c2d4不一定是Huffman树;的越靠近根结点;(3)HT不唯一,但WPL一定相等。Evaluation

only.ated

with

A7spose.Slides

for

.NE(T1)3.完5全Cl二i叉en树t并ProfiCopyright

2004-2011(A2s)pHoTs是e权Pt值y越L大td.6.6

哈夫曼树及其应用2.构造Huffman树算法(1)以权值分别为W1,W2...Wn的n各结点,构成n棵二叉树T1,T2,...Tn并组E成v森al林uFa=t{iTo1,nT2o,.nl.y..Tn},其中每棵(2)在F中选取两棵根结点权值最小的树作为左右子树构造(4)重复(2).(3)直到F中只含一棵二叉树为止,这棵二叉树就是Huffman树。ated二wi叉t树h

ATis仅p有o有s一e.个S权li值d为esWif的o根r根.结N点ET;3.5

Client

Profi一棵新二C叉o树py,r并i并g且ht置2新0二04叉-树20根1结1点As权po值s为e左Pt右y子L树

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论