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