第 6 章 树和二叉树

131
第6章 树和二叉树 树型结构是一类重要的非线性数据结构。其中以树 和二叉树最为常用,直观看来,树是以分支关系定义 的层次结构。树结构在客观世界中广泛存在,如人类 社会的族谱和各种社会组织机构都可用树来形象表示。 树在计算机领域中也得到广泛应用,如在编译程序中, 可用树来表示源程序的语法结构。又如在数据库系统 中,树形结构也是信息的重要组织形式之一。本章重 点讨论二叉树的存储结构及其各种操作,并研究树和 森林与二叉树的转换关系,最后介绍几个应用例子。

Upload: howe

Post on 22-Jan-2016

295 views

Category:

Documents


0 download

DESCRIPTION

第 6 章 树和二叉树. 树型结构是一类重要的非线性数据结构。其中以树和二叉树最为常用,直观看来,树是以分支关系定义的层次结构。树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树来形象表示。树在计算机领域中也得到广泛应用,如在编译程序中,可用树来表示源程序的语法结构。又如在数据库系统中,树形结构也是信息的重要组织形式之一。本章重点讨论二叉树的存储结构及其各种操作,并研究树和森林与二叉树的转换关系,最后介绍几个应用例子。. 6 . 1 树的定义和基本术语 ( 1 学时). 树 (Tree) 是 n(n≥0) 个结点的有限集。在任意一棵非空树中: - PowerPoint PPT Presentation

TRANSCRIPT

  • 6

  • 6.1 1 (Tree)n(n0) (1)(Root) (2)n>1m(m>0)T1T2Tm(SubTree)

  • 6.1(a)(b)13AT1= {BEFKL}T2={CG}T3={DHIJM}T1T2T3AT1BT11={EKL}T12={F}T11 T12BT11E{K}{L}

    (a) (b) 6.1 A

  • 6.26.1(b) (a)()

    (a)

  • (b)

    (A(B(E(K , L) , F) , C(G) ,D(H(M) , I , J))) (b)

    (c)()

    ( c )

  • (Degree)6.1(b)A3C1F0 0(1eaf)6.1(b)KLFGMIJ 06.1(b)3

  • (child)(Parent)6.1(b)DAT3DAAD(sibling)HIJDMMADHBEKL F

  • (level)ii+1 GEFHIJ(Depth) 6.1(b)4 () (Forest)m(m0)

  • Tree= (rootF)rootFm(m0)F=(T1T2Tn)Ti=(riFi)rootim!=0 RF={| i=1 , 2 , , m , m >0 }

  • ADT Tree { D D R DDRR={H} H (1)DrootH (2)D-{root}!=D-{root)D1D2Dm (m>0)j!=k(1jkm)DiDk=i(1im)xiDiH

  • (3)D-{root}H-{}H1H2Hm(m>0)j!=k(1jkm)HjHk=i(1im)HiDiDi ,{Hi})root

    InitTree(T) T DestroyTree(&T) T T

  • CreateTree(&Tdefinition) definitionT definitionT ClearTree(T) T T TreeEmpty(T) T TTRUEFALSE TreeDepth(T) T T

  • Root(T) T T Value(Tcur_e) Tcur_eT cur_e Assign(Tcur_evalue) Tcur_eT cur_evalue Parent(Tcur_e) Tcur_eT cur_eT

  • LeftChild(Tcur_e) Tcur_eT cur_eTRightsibling(Tcur_e) Tcur_eT cur_e InsertChild(&T&pic) TpT1ip+1cT cTpi

  • DeleteChild(T&pi) TpT1ip TpiTraverseTree(TVisit()) TVisit Tvisit()visit()}ADT Tree

  • 6.2 2 6.2.1 (BinaryTree)(2)

  • ADT BinaryTree { D D R D= R=BinaryTree D!= R={H}H (1)DrootH (2)D-{root}!=D-{root}={DlDr}DlDr=

  • (3)D!=DlxlHDlH1HDr!=DrxrHDrHrH H={HlHr} (4)(Dl{Hl})(Dr{Hr})

  • P InitBiTree(&T) T DestroyBiTree(&T) T T CreateBiTree(&Tdefinition) definitionT definitionT ClearBiTree(&T) T T

  • BiTreeEmpty(T) T TTRUE FALSE BiTreeDepth(T) T T Root(T) T T Value(Te) TeT e

  • Assign(T&evalue) TeT evalue Parent(Te) TeT eT LeftChild(Te) TeT ee RightChild(Te) TeT ee

  • Leftsibling(Te) TeT eeT RightSibling(Te) TeT eeT

  • InsertChild(T , p , LR , c); TpTLR01cT LR01cTppc DleteChild(TpLR) TpTLR01 Ix01Tp

  • LevelOrderTraverse(TVisit()) TVisit TVisit visit()PreOrderTraverse(TVisit()) TVisit TVisitvisit

  • InOrderTraverse(TVisit()) TVisit TVisitvisit PostOrderTraverse(TVisit()) TVisit TVisitvisit}ADT BinaryTree

  • (a)(b)(c)(d)(e)

  • 6.2.2

    1 i2i-1(i1) i=1 2i-1=20=1 j1j

  • 2 k2k-1(k1)1k

    k k (i) =2i-1=2k -1 i=1 i=1

  • 3 Tn02n2n0=n2+1 n1T12 n=n0+n1+n2 (61) Bn=B+112B=n1+ 2n2 n=n1+2n2+1 (62) (61)(62) n0=n2+1

  • k2k-16.4(a)4

    6.4(a) knk1n

  • 6.4(b)4(1)(2)LLL+16.4(c)(d)

    6.4(b) 6.4(c) 6.4(d)

  • 4 n[ log2n ]+1 k2 2k-1-1

  • 5 n([log2n]+1)(1[log2n]+1)i(1in) (1)i=1ii>1PARENT(i)[ i/2 ] (2) 2i>ni(i)LCHILD(i)2i (3)2i+1>niRCHILD(i)2i+1

    (a)ii+1 (b)ii+1 6.5 ii+1

  • (2)(3)(2)(3)(1) i=122>n2ii333>ni i>1 (1)j (1j[log2n] )i(2i=2j-1)j+12j=2(2j-1)=2i2i>nj+12i+12i+1>n

  • (2)j(1j[log2n])i(2j-1i
  • 6.2.3 // #define MAX_TREE_SIZE 100 // typedef TElemType SqBiTree[MAX_TREE_SIZE]; //0 SqBiTree bt

  • ii-1(6.4(b) (c) )

    (a)

    (b) 66

    123456789101112

    12345000067

  • (6.7(a))6.7(b)6.7(c)

    6.7

  • 6.8nn+16.3

    (a) (b) (c) 68

  • 6.3 2 6.3.1 (Traversing Binary Tree)

  • LDRDLRLDRLRDDRLRDLRLD()()() (1) (2) (3)

  • (1) (2) (3)

    (1) (2) (3)

  • PreOrderTraverse ( T, visit)

  • Status PreOrderTraverse ( Bitree T, Status (*Visit)(TElemType e)){////visit//T//visit//visit // Status PrintElement(TElemType e){ // printf(e) e // return OK} //PreOrderTraverse(TPrintElement)

  • if(T) { if(Visit(T->data)) if(PreOrderTraverse(T->lchildVisit)) if(PreOrderTraverse(T->rchildVisit)) return OK; return ERROR}else return OK}//PreOrderTraverse

    6.1

  • 6.9 a+b*(c-d)-e/f -+a*b-cd/ef (63) a+b*c-d-e/f (64) abcd -*+ef/- (65) (63) (64)(65) () () 6.9

  • (1)(2)(3)6.26.3

  • Status InOrderTraverse(BiTree T Status(*Visit)(TElemType e)){ //Visit //TVisit InitStack(S) Push(ST)// while(!StackEmpty(S)){ while(GetTop(Sp)&&p)Push(Sp->lchild) // Pop(Sp) //

  • if(!StackEmpty(s)){ // Pop(Sp) if(!Visit(p->data)) return ERROR Push(Sp->rchild) }//if }//While return OK}// InOrderTraverse 6.2

  • Status InOrderTraverse(BiTreeT Status(*Visit)(TElemType e)){ //Visit //TVisit InitStack(S) p=T while(p || !StackEmpty(S)){ if(p){ Push(Sp) p=p->lchild }//

  • else{ // Pop(Sp) if(!Visit(p->data)) return ERROR p=p->rchild }//else }//While return OK }//InOrderTraverse 6.3

  • 6.46.8(b) A B C D E G F ()

  • Status CreateBiTree(BiTree&T){ //(1) //T scanf(&ch) if(ch== ) T=NULL else{ if(!(T=(BiTNode*)malloc(sizeof(BiTNode)))) exit(OVERFLOW) ;

  • T->data=ch // CreateBiTree(T->lchild) // CreateBiTree(T->rchild) // } return OK;} //CreateBiTree 6.4

  • nO(n)nO(n)(6.13)8.5

  • 6.3.2 ()()6.9a+b*c-d-e/fc*-

  • ?fwdbkwdnn+1

  • lchildlchildrchildrchild

    ltag=0 , lchild ltag=1 , lchild ltag=0 , rchild ltag=1 , rchild

    lchildltagdatartagrchild

  • 6.11(a)6.11(b) () thrt ()

    6.5 (a) 6.6 (b)

  • ?6.11b**-1*c1()

  • O(n)

    // typedef enum{LinkThread } PointerTag typedef struct BiThrNode { TElemType data struct BiThrNode * lchild * rchild; PointerTag LTagRTag }BiThrNode *BiThrTree

  • lchildrchildlchild rchild(6.11(b))6.5

    Status InOrderTraverse_Thr(BiThrTree T , Status(*Visit)(TElemType e)) { //Tlchild //T //Visit

  • p=T->lchild //p while(p!=T){ //p==T while(p->Ltag==Link) p=p->lchild if(!Visit(p->data)) return ERROR // while(p->Rtag==Thread&&p->rchild!=T){ p=p->rchildVisit(p->data)// } p=p->rchild } return OK}// InOrderTraverse_Thr 6.5

  • (1)x(2)x(3)x 6.12BCCD FGD E 6.12

  • ?

    preppre6.66.7

  • Status InOrderThreading (BiThrTree &ThrtBiThrTree T){ //T //Thrt if(!(Thrt=(BiThrTree)malloc(sizeof(BiThrNode)))) exit(OVERFLOW) Thrt->Ltag=Link Thrt->Rtag=Thread // Thrt->rchild=Thrt //

  • if(!T)Thrt->lchild=Thrt // else{ Thrt->lchild = T; pre = Thrt; InThreading(T) // pre->rchild= Thrt; pre->Rtag = Thread ; // Thrt->rchild=pre; } return OK}//InOrderThreading 6.6

  • void InThreading(BiThrTree p){ if(p) { InThreading(p->lchild) // if(!p->lchild) {p->Ltag=Thread p->lchild=pre} if(!pre->rchild){pre->RTag = Thread pre->rchild= p; } pre = p //prep InThreading(p->rchild) // }}// InThreading 6.7

  • 6.4 1

  • 6.4.1 // #define MAX_TREE_SIZE 100 typedef struct PTNode { TElemType data int parent // }PTNode

  • typedef struct{ PTNode nodes[MAX_TREE_SIZE] int n //}PTree6.13

  • ()PARENT(Tx)PARENTROOT(x)

  • ddnkn(k-1)+1ddegreed

    datachild1child2 childd

    datadegreechild1child2 childd

  • nn()n

    6.13

  • // typedef struct CTNode{ // int child struct CTNode *next }*ChildPtr typedef struct { TElemType data ChildPtr firstchild// }CTBox typedef struct { CTBox nodes[MAX_TREE_SXZE] int nr // } CTree

  • firstchildnextsibling

    //() typedef struct CSNode { ElemType data struct CSNode * firstchild *nextsibling }CSNode*CSTree

  • 6.156.13xifirstchild1 nextsiblingi-1xiPARENTPARENT(Tx)

  • 6.4.2

  • 6.16

  • F={TlT2Tm}B=(rootLBRB) (1)Fm=0B (2)Fm!=0BrootROOT(T1)BLBTlFl={T11,T12,T1m}RBF={T2,T3,,Tm}

  • B=(rootLBRB)F={T1T2Tm} (1)BF (2)BFT1ROOT(T1)BrootT1F1BLBFT1F={T2T3Tm}BRB

  • 6.4.3 ()()

    6.16 AB C D E B D C E A

  • (1) (2) (3) (1) (2) (3)

  • 6.17ABCDEFGHIJ BCDAFEHJIG

  • 6.6 2 (Huffman)

    6.6.1 () 6.2.1

  • n WPL= wklk k=1 n{w1,w2,,wn}nwiWPL

  • 6.224abcd7524 (a)WPL=7*2+5*2+2*2+4*2=36 (b)WPL=7*3+5*3+2*1+4*2=46 (c)WPL=7*1+5*2+2*3+4* 3=35

    (c)7 524

  • if(a
  • 6.23(a)

    0-5960-69 70-79 80-8990-100 0.05 0.15 0.40 0.30 0.10

  • 805154030 106.23(b)

    6.23(a) (b)

  • 6.23(c)100006.23(a)315006.23(c)22000

    (c)

  • ? (1)n{W1W2Wn}nF={T1T2Tn}TiWi (2)F (3)FF (4)(2)(3)F

  • 7 5 2 4

    (a)

    7 5 6 7 11 18

    (b) (c) (d) abcdddcbacbadcba

  • 6.6.2

    ABACCDAABCD000110110001001010110014

  • A BCD00010190000110100000AAAAABABB

  • 6.25ABCD016.25ABCD0101101116.25

  • ?wilinwiliwiliwilin

  • 1((strict)())n2n-12n-1?

  • // typedef struct { unsigned int weight unsigned int parentlchildrchild }HTNode*HuffmanTree // typedef chat * *HuffmanCode //

    6.12

  • void HuffmanCoding(HuffmanTree &HT HuffmanCode &HCint *wint n){//wn(>0)HT//nHC if(n

  • for (i=n+1i
  • // HC=(HuffmanCode)malloc((n+1)*sizeof(char*)); //n cd=(char*)malloc(n*sizeof(char)); // cd[n-1]=0; //

  • for(i=1; i
  • HTn6.126.13 // HC = (HuffmanCode)malloc((n+1) * sizeof(char *)) p=m cdlen=0 for(i=1; i
  • while(p){ if(HT[p].weight==0){ // HT[p].weight =1 if(HT[p].lchild!=0){ p=HT[p].lchild cd[cdlen++]=0} else if(HT[p].rchild==0){ // HC[p]=(char *)malloc((cdlen+1)*sizeof(char)) cd[cdlen]=0; strcpy(HC[p]cd) //() } }

  • else if (HT[p].weight= =1){ // HT[p].weight=2 if (HT[p].rchild !=0) {p=HT[p].rchild cd[cdlen++]=1} }else{ // HT[p].weight= =2 HT[p].weight = 0; p = HT[p].parent; --cdlen; //1 }//else}//While 6.13

  • 6-2 0.050.290.070.080.140.230.030.11 w=(526781423311)n=8m=156.26HT627(a)6.27 (b)6.27(c) 6.26

  • HT HT weight parent lchild rchild weight parent lchild rchild1 12 23 34 45 56 67 78 89 9 10 1011 1112 1213 1314 1415 15 (a) (b) (a)HT (b)HT

    5 0 0 0 29 0 0 0 7 0 0 0 8 0 0 0 14 0 0 0 23 0 0 0 3 0 0 0 11 0 0 0 - 0 0 0 - 0 0 0 - 0 0 0 - 0 0 0 - 0 0 0 - 0 0 0 - 0 0 0

    5 9 0 0 29 14 0 0 7 10 0 0 8 10 0 0 14 12 0 0 23 13 0 0 3 9 0 0 11 11 0 0 8 11 1 7 15 12 3 4 19 13 8 9 29 14 5 10 42 15 6 11 58 15 2 12 100 0 13 14

  • HC

    12345678

    (c)HC 6.27 62

    0 1 1 01 01 1 1 01 1 1 11 1 00 00 1 1 10 1 0

  • 1 1.1 1.2 1.3 1.4

  • 2

    2.1 (Tree)n(n0) (1)(Root) (2)n>1m(m>0)T1T2Tm(SubTree)

  • 2.2

  • .3

  • 2.4 (BinaryTree)(2)

  • 2.5 1 i2i-1(i1) 2 k2k-1(k1) 3 Tn02n2n0=n2+1 4 n[ log2n ]+1 5 n([log2n]+1)(1[log2n]+1)i(1in) (1)i=1ii>1PARENT(i)[ i/2 ] (2)2i>ni(i)LCHILD(i)2i (3)2i+1>niRCHILD(i)2i+1

  • 2.6

    1 ii-l k2k-1 2

  • 2.7

  • 2.8 12

    2.9

  • 2.10

    2.11 WPLWPL

  • 2.13 (1) n{WlW2Wn}nF={T1T2Tn}TiWi (2) F (3) FF (4) (2)(3)F

  • 2.14 1 2

  • 12

    2

  • 3HkHk1

    1 2p 3pi 4p

  • 4nk0

    5abc

  • 6

    (a) (b) (c)

    (d) ACBAKJIHGFECDBACBA

  • 7EBADCFHGIKJABCDEFGHIJK

    8parent)mark0..2

  • 9Tk1,k2)(ki,kj),ki,kj(father,)

  • 10 1 2 3 4 5 6 7 8 9 10 11 12 13 14

    InfoABCDEFGHIJKLMNLtagLchild24607010012130000RtagRchild3500891100014000

  • 110.07, 0.19, 0.02, 0.06, 0.32, 0.03, 0.21, 0.100-7

  • 12DescNumDescNum

    13-