第六章 树和二叉树
DESCRIPTION
第六章 树和二叉树. 树的概念与定义 二 叉 树 二叉树的遍历与线索化 树和森林 哈夫曼树及其应用 树的计数 *. 6. 1 树的概念与定义. 树的定义: 树 (tree) 是 n(n≥0) 个结点的有限集 T ,当 n=0 时,称为空树;当 n>0 时,满足以下条件: ( 1 )有且仅有一个结点被称为树根( root )结点; ( 2 )当 n>1 时,除根结点以外的其余 n-1 个结点可以划分成 m(m>0) 个互不相交的有限集 T1,T2, … , Tm ,其中每一个集合本身又是一棵树,称为根的子树 (subtree) 。. - PowerPoint PPT PresentationTRANSCRIPT
-
*
-
6. 1(tree)n(n0)Tn=0n>0 1root2n>1n-1m(m>0)T1,T2,Tm(subtree)
-
6.1
-
(node) (degree)6.1A3 (leaf)06.1KLFGMIJ 06.1ABCD
-
(child)6.1ABCDBEF (parents)6.1IDLE (sibling)6.1BCDKL
-
6.13(level)ll+16.1A1M4(depth)6.14 (forest)m(m0)
-
6.2 n(n0)T
-
1 i2i-1(i1) 2 k2k1k>=1 3 BTn02n2n0n21 4 nlog2n1xx
-
5 ni(1in) (1) i=1ii>1i/2 (2) 2i>ni2in2i (3) 2i+1>ni2i+1n2i+1
-
k2k-1 knk1n
-
:1111
-
:3 nn+1
-
6.3 1 2 3
-
123 1 23
-
: -+a*bcd/ef: a+b*cde/f: abcd-*+ef/-
-
typedef struct Node{ datatype data; struct Node *Lchild; struct Node *Rchild; } BTnode,*Btree;
-
void preorder(Btree root){ if(root!=NULL) { Visit(root->data); preorder(root->Lchild); preorder(root->Rchild); }}
-
void InOrder(Btree root){ if(root!=NULL){ InOrder(root->Lchild); Visit(root->data); InOrder(root->Rchild); }}
-
void PostOrder(Btree root){if(root!=NULL) { PostOrder(root->Lchild); PostOrder(root->Rchild); Visit(root ->data); }}
-
n+1 ,2
-
0 LchildLtag= 1 Lchild 0 RchildRtag= 1 Rchild
-
(b) (a)
-
visitvisit
-
Void paintnode (Btree root) { if (root!=NULL) { printf (root ->data); paintnode (root ->Lchild); paintnode (root ->Rchild); }}
-
Void paintleaf (Btree root) { if (root!=NULL) { if(root->Lchild==NULL && root->Rchild==NULL) printf (root ->data); paintleaf (root ->Lchild); paintleaf (root ->Rchild); }}
-
Void leafcount(Btree root){ if(root!=NULL) { leafcount(root->Lchild); leafcount(root->Rchild); if (root ->Lchild==NULL && root ->Rchild==NULL) count++; }}
count
-
ABDGCEHFABDGCEHF
-
(datatypechar)Void CreateBtree(Btree *bt){ char ch; ch=getchar(); if(ch=='.') *bt=NULL; else { *bt=(Btree)malloc(sizeof(BTnode)); (*bt)->data=ch; CreateBiTree(&((*bt)->Lchild)); CreateBiTree(&((*bt)->Rchild)); }}
-
1021 int TreeDepth(Btree bt) { int hl,hr,max; if(bt!=NULL) { hl=TreeDepth(bt->Lchild); hr=TreeDepth(bt->Rchild);
-
max=(hlhr); return(max+1); } else return(0);}
-
p,p->Ltag=1p->Lchildpp->Ltag=0pp Void Previous(ThreadTnode * p, ThreadTnode *pre){ThreadTnode *q; if(p->Ltag==1) pre= p->Lchild; else { for(q= p->Lchild;q->Rtag==0;q=q->Rchild); pre=q; }}
-
pp->Rtag=1p->Rchildpp->Rtag=0pp Void Succedent(ThreadTnode *p, ThreadTnode *succ) {ThreadTnode *q; if (p->Rtag==1) succ= p-> RChild; else { for(q= p->RChild; q->Ltag==0 ;q=q->LChild ); succ=q; }}
-
6.4
-
#define Maxsize 50typedef struct Node{ DataType data; int parent;}Tnode;Tnode Ptree[Maxsize];
-
101124440601234578dataparent6.10(a) (b)
-
nn
#define Maxsize 50typedef struct ChildNode{ int Child; struct ChildNode * next;}ChildNode;typedef struct{ DataType data; ChildNode * ChildHead ;}DataNode; DataNode Ctree[Maxsize];
-
6.10
-
typedef struct CSNode{ DataType data; Struct CSNode *FirstChild, *Nextsibling;}*CSTree;
-
6.14
-
45
-
ppp
-
a. b. a. b. n
-
ABEFIGCDHJKLNOMEIFGBCJKNOLMHDAABCDEFGHIJKLMNO
-
a. b. c. a. b. c. a. b. c.
-
A B C D E F G H I JB C D A F E H J I GD C B F J I H G E A6.18(a)
-
6.5
-
nWPL
-
475244WPL=7*2+5*2+2*2+4*2=36WPL=7*3+5*3+2*1+4*2=46WPL=7*1+5*2+2*3+4*3=35
-
HuffmanHuffman Huffmann{w1,w2,wn}nwj
-
w={5, 29, 7, 8, 14, 23, 3, 11}
-
6.24a6.24 b
-
6.24a80% 5154030106.24b,
-
7
-
typedef struct Node{ int weight ; int parent, LChild,RChild ;} HTNode, * HTree;typedef char * *HuffmanCode ;
viod CreatHTree(HTree *ht , HuffmanCode *hc,int * w, int n){ /*wn,ht,hc */ int start; m=2*n-1; *ht=(HTree)malloc((m+1)*sizeof(HTNode));
- for(i=1;i
- /**/*hc=(HuffmanCode)malloc((n+1)*sizeof(char *));cd=(char * )malloc(n * sizeof(char));cd[n-1]\0for(i=1;i
-
6.6 * n n n0b01 n1b11 n2b226.26 n3b356.276.26 n2 6.27 n3
-
n(n>1)in-i-16.280in-1 6.28 n
-
n3b3b0*b2 +b1* b1 +b2* b0=5
-
ntn n-1tn=bn-1 43 6.31