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