![《數(shù)據(jù)結(jié)構(gòu)用C語言描述》第六篇.jsp_第1頁](http://file4.renrendoc.com/view/880c8519d0facf5becd427379e0ea23b/880c8519d0facf5becd427379e0ea23b1.gif)
![《數(shù)據(jù)結(jié)構(gòu)用C語言描述》第六篇.jsp_第2頁](http://file4.renrendoc.com/view/880c8519d0facf5becd427379e0ea23b/880c8519d0facf5becd427379e0ea23b2.gif)
![《數(shù)據(jù)結(jié)構(gòu)用C語言描述》第六篇.jsp_第3頁](http://file4.renrendoc.com/view/880c8519d0facf5becd427379e0ea23b/880c8519d0facf5becd427379e0ea23b3.gif)
![《數(shù)據(jù)結(jié)構(gòu)用C語言描述》第六篇.jsp_第4頁](http://file4.renrendoc.com/view/880c8519d0facf5becd427379e0ea23b/880c8519d0facf5becd427379e0ea23b4.gif)
![《數(shù)據(jù)結(jié)構(gòu)用C語言描述》第六篇.jsp_第5頁](http://file4.renrendoc.com/view/880c8519d0facf5becd427379e0ea23b/880c8519d0facf5becd427379e0ea23b5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第六章樹和二叉樹樹的概念和基本術(shù)語二叉樹二叉樹遍歷二叉樹的計數(shù)樹與森林哈夫曼樹樹的概念和基本術(shù)語樹的定義樹是由n
(n 0)個結(jié)點的有限集合。如果n
=
0,稱為空樹;如果n
>
0,則有且僅有一個特定的稱之為根(Root)的結(jié)點,它只有直接后繼,但沒有直接前驅(qū);當(dāng)n>1,除根以外的其它結(jié)點劃分為m
(m>0)個互不相交的有限集T1,T2
,…,Tm,其中每個集合本身又是一棵樹,并且稱為
根的子樹(SubTree)。ABKL例如A只有根結(jié)點的樹C
DE
F
G
H
I
JM有13個結(jié)點的樹其中:A是根;其余結(jié)點分成三個互不相交的子集,
T1={B,E,F,K,L};T2={C,G};T3={D,H,I,J,M},T1,T2,T3都是根A的子樹,且本身也是一棵樹樹的基本術(shù)語1層2層4層3層height=
4DMAB
CE
F
G
H
I
JK
L·
結(jié)點·
結(jié)點的度·
葉結(jié)點·
分支結(jié)點·
子女
·
祖先·
雙親
·
子孫·
兄弟
·
結(jié)點層次·
樹的深度·
樹的度·
森林二叉樹(Binary
Tree)定義五種形態(tài)一棵二叉樹是結(jié)點的一個有限集合,該集合或者為空,或者是由一個根結(jié)點加上兩棵分別稱為左子樹和右子樹的、互不相交的二叉樹組成。LLRR特點每個結(jié)點至多只有兩棵子樹(二叉樹中不存在度大于2的結(jié)點)在二叉樹的第i
層上至多有2i-1個結(jié)點。(i1)[證明用歸納法]證明:當(dāng)i=1時,只有根結(jié)點,2
i-1=20=1。假設(shè)對所有j,i>j
1,命題成立,即第j層上至多有2
j-1
個結(jié)點。由歸納假設(shè)第i-1層上至多有2i-2個結(jié)點。由于二叉樹的每個結(jié)點的度至多為2,故在第i層上的最大結(jié)點數(shù)為第i-1層上的最大結(jié)點數(shù)的2倍,即2*
2i-2=2
i-1。性質(zhì)性質(zhì)1性質(zhì)2
深度為k
的二叉樹至多有
2
k-1個結(jié)點(k 1)。證明:由性質(zhì)1可見,深度為k的二叉樹的最大結(jié)點數(shù)為=20
+
21
+
…
+
2
k-1
=
2
k-1=性質(zhì)3
對任何一棵二叉樹T,
如果其葉結(jié)點數(shù)為n0,
度為2的結(jié)點數(shù)為n2,則n0=n2+1.證明:若度為1的結(jié)點有n1個,總結(jié)點個數(shù)為n,總邊數(shù)為e,則根據(jù)二叉樹的定義,n
=
n0
+
n1
+
n2
e
=
2n2
+
n1
=
n
-
1因此,有
2n2
+
n1
=
n0
+
n1
+
n2
-
1n2
=
n0
-
1
n0
=
n2
+
1兩種特殊形態(tài)的二叉樹62定義1
滿二叉樹(Full
Binary
Tree)一棵深度為k且有2
k-1個結(jié)點的二叉樹稱為滿二叉樹。175438
9
10
11
12
13
14
15滿二叉樹2154367216543非完全二叉樹定義2
完全二叉樹(Complete
Binary
Tree)若設(shè)二叉樹的高度為h,則共有h層。除第h
層外,其它各層(0
h-1)
的結(jié)點數(shù)都達(dá)到最大個數(shù),第h
層從右向左連續(xù)缺若干結(jié)點,這就是完全二叉樹。62175438 9
10
11
12完全二叉樹0)個結(jié)點的完全二叉樹+1性質(zhì)4
具有n
(n的深度為
log2(n)證明:設(shè)完全二叉樹的深度為h,則根據(jù)性質(zhì)2和完全二叉樹的定義有n
<
2h2h-1
-1<n 2h-1或2h-1取對數(shù)h-1<log2nh,又h是整數(shù),因此有h
=
log2(n)
+1性質(zhì)5
如將一棵有n個結(jié)點的完全二叉樹自頂向
下,同一層自左向右連續(xù)給結(jié)點編號1,2,…,n,則有以下關(guān)系:若i=1,則i無雙親若i
>
0,
則i
的雙親為 i
/2若2*i<=n,則i的左子女為2*i,若2*i+1<=n,則i的右子女為2*i+1■若結(jié)點編號i為奇數(shù),且i!=1,則左兄弟結(jié)點i-1.■若結(jié)點編號i為偶數(shù),且小于n,則右兄弟結(jié)點為i+1.■結(jié)點i
所在層次為
log2(i+1)182345679
10二叉樹的存儲結(jié)構(gòu)1
2
3
4
0
5
6
7
8
0
0
910一般二叉樹的順序表示8
9
101
2
3
4
5
6
7
8
910完全二叉樹的順序表示1236547
8
9·順序表示12
34
5
6
7190·鏈表表示datalChildrChild二叉鏈表lChild
data
rChild含兩個指針域的結(jié)點結(jié)構(gòu)lChild
data
parent
rChild含三個指針域的結(jié)點結(jié)構(gòu)parentdatalChildrChild三叉鏈表二叉樹鏈表表示的示例BBBCCC
DDDFErootArootArootAE
F二叉樹E
F二叉鏈表三叉鏈表三叉鏈表的靜態(tài)結(jié)構(gòu)ABC
DE
Frootdataparentlchildrchi0A-11-11B0232C1-1-13D1454
E5
F33-1-1-1-1typedefchar
datatype;//結(jié)點數(shù)據(jù)類型//結(jié)點定義typedef
struct
node
{datatype
data;struct
node
*
lChild,
*
rchild;}
bitree;typedef
bitree
*
bitree;//根指針二叉鏈表的定義介紹按完全二叉樹的層次順序,依次輸入結(jié)點信息建立二叉樹的算法。算法的基本思想:1、依次輸入結(jié)點信息,若輸入的結(jié)點不是虛結(jié)點,則建立一個新結(jié)點。2、若新結(jié)點是第一個結(jié)點,則令其為根結(jié)點;否則作為孩子連接到其雙親結(jié)點上。3、重復(fù)上述過程,至到輸入結(jié)束信息為止。二叉樹的生成為此,設(shè)置一個指針類型的數(shù)組隊列,保存已輸入結(jié)點的地址。1、先輸入的結(jié)點的孩子必定比后輸入的結(jié)點的孩子先進(jìn)隊列,因此可利用隊頭指針front指向當(dāng)前必須與其孩子結(jié)點建立連接的雙親結(jié)點,利用隊尾指針
rear指向當(dāng)前輸入的結(jié)點。2、若rear為偶數(shù),作為左孩子與雙親連接,否則作為右孩子與雙親連接。3、若雙親結(jié)點或孩子結(jié)點為虛結(jié)點,則無須連接。4、若雙親結(jié)點與其兩個孩子連接完畢,則做出隊操作,使頭指針指向下一個等待連接的雙親結(jié)點。bitree
*Q[maxsize];bitree
*CREATREE(
){
char
ch
;
int front
, rear
;bitree
*root
,
*s
;root
=
null
; front
=
1
;
rear
=
0
;ch
=
getchar(
)
;while
(
ch
!=
‘
#
’
){
s
=
null
;if
(
ch
!=
‘
@
’
){
s
=
malloc(sizeof(bitree));s.data
=
ch
;
s.lchild
=
null
;s,rchild
=rear
+
+
; Q[rear]
=
s
;if
(rear
==
1
)
root
=
s
;else{
if
(
s
&&
Q[front]
)if
(rear%2==0
)
Q[front].lchild
=
s
;else
Q[front].rchild
=
s
;front
+
+
;if
(
rear%2==1
)}ch
=
getchar
(
)
;}return
root
;}二叉樹遍歷樹的遍歷就是按某種次序訪問樹中的結(jié)點,要求每個結(jié)點訪問一次且僅訪問一次。設(shè)訪問根結(jié)點記作D
遍歷根的左子樹記作L遍歷根的右子樹記作R則可能的遍歷次序有前序
DLR中序
LDR后序
LRDDLR中序遍歷(Inorder
Traversal)--/*·
中序遍歷二叉樹算法的定義:若二叉樹為空,則空操作;否則中序遍歷左子樹(L);+訪問根結(jié)點(D);中序遍歷右子樹(R)。ab遍歷結(jié)果a
+
b
*
c
-
d
-
e
/
fcdef·中序遍歷二叉樹的遞歸算法voidInOrder
(
bitree
*t){if
(
t
!=
NULL
){InOrder
(
t->lchild
);printf(“\t%c\n”,
t->data);InOrder
(
t->rchild
);}}否則訪問根結(jié)點(D);前序遍歷左子樹(L);前序遍歷右子樹(R)。遍歷結(jié)果-
+
a
*
b
-
c
d
/
ef前序遍歷(Preorder
Traversal)·
前序遍歷二叉樹算法的定義:若二叉樹為空,則空操作;--/+*abcdef·前序遍歷二叉樹的遞歸算法void
PreOrder
(
bitree
*t
){if
(
t
!=
NULL
){printf(“\t%c\n”,t->data);PreOrder
(
t->lchild
);PreOrder
(
t->rchild
);}}后序遍歷左子樹(L);后序遍歷右子樹(R);訪問根結(jié)點(D)。遍歷結(jié)果a
b
c
d
-
*
+
e
f
/
-后序遍歷(PostorderTraversal)·
后序遍歷二叉樹算法的定義:若二叉樹為空,則空操作;否則--/+abcde*
f·后序遍歷二叉樹的遞歸算法:void
PostOrder
(
bitree
*
t
){if
(
t
!=
NULL
){PostOrder
(
t->lchild
);PostOrder
(
t->rchild
);printf(“\t%c\n”,t->data);}}return1
+
Count
(
T->lchild
)+
Count
(
T->rchild
);}1.
計算二叉樹結(jié)點個數(shù)(遞歸算法)int
Count
(
bitree
*T
){if
(
T
==
NULL
)
return
0;elseint
Leaf_Count(Bitree
*T){//求二叉樹中葉子結(jié)點的數(shù)目if(!T)
return
0;
//空樹沒有葉子else
if(!T->lchild&&!T->rchild)return
1;
//葉子結(jié)點else
returnLeaf_Count(T.lchild)+Leaf_Count(T.rchild//左子樹的葉子數(shù)加上右子樹的葉子數(shù)}2.
求二叉樹中葉子結(jié)點的個數(shù)int
Height
(
bitree
*
T
){
int
m,
n
;if
(
T
==
NULL
)
return
-1;else{
m
=
Height
(
T->lchild
);n
=
Height
(
T->rchild
);return
(m
>
n)
?
m+1
:
n+1;}}3.
求二叉樹高度(遞歸算法)4.
復(fù)制二叉樹(遞歸算法)int
Copy(
bitree
*
T
){
if
(
T
==
NULL
)
return
-1;bitree
*
temp;Temp->data=T->data;Temp->
lchild
=
Copy(
T->lchild
);Temp->
rchild
=Copy(T->rchild
);return
temp;}5.
判斷二叉樹等價(遞歸算法)int
Equal(
bitree
*a,
bitree
*b){
if
(
a
==
NULL
&&
b
==
NULL
)return
1
;if
(
a
!==
NULL
&&
b
!==
NULL&&
a->data==b->data&&
equal(
a->lchild,
b->lchild)&&
equal(
a->rchild,
b->rchild)
)return
1;else
return
0;//a和b的子樹不等同}中序遍歷二叉樹(非遞歸算法)用棧實現(xiàn)baabcdedaa
b入棧ab退棧訪問d入棧ad退棧訪問ce
退棧訪問棧空a退棧訪問ecc
e
入棧c
退棧訪問void
InOrder
(
bitree
*T
){ stack*S;
SETNULL(
S
);
//遞歸工作棧bitree
*p
=
T;
//初始化while
(
p
!=
NULL
||
!Empty(S)
){
if(
p
!=
NULL
){
Push(S,
p);
p
=
p->lchild;
}if
(
!Empty(S)
){
Pop(S,
p);//棧非空//退棧//訪問根printf(“%c\n”,
p->data
);p
=
p->rchild;}//if}//whilereturn
ok;}abcde前序遍歷二叉樹(非遞歸算法)用棧實現(xiàn)bcdeadccc訪問訪問退棧退棧訪問abdce進(jìn)棧進(jìn)棧訪問訪問左進(jìn)cddc空左進(jìn)左進(jìn)左進(jìn)左進(jìn)退棧b空空e結(jié)束void
PreOrder(
bitree
*T
){
stack
*S;
SETNULL(S);//遞歸工作棧bitree
*
p
=
T;
Push
(S,
NULL);while
(
p
!=
NULL
){
printf
(“%c\n”,
p->data
);if
(
p->rchild
!=
NULL
)Push
(
S,
p->rchild
);if
(p->lchild
!=
NULL
)p
=
p->lchild;else
Pop(
S,
p
);}}a//進(jìn)左子樹bcde·后序遍歷二叉樹(非遞歸算法)用棧實現(xiàn)后序遍歷時使用的棧的結(jié)點定義typedef
struct
{bitree
*ptr;//結(jié)點指針enum
tag{L,R};
//該結(jié)點退棧標(biāo)記}
StackNode;
ptr
tag{L,R}根結(jié)點的tag
=
L,表示從左子樹退出,
訪問右子樹。tag
=
R, 表示從右子樹退出,
訪問根?!oid
PostOrder
(
BinTree
T
)
{stack
S;
InitStack(&S);
StackNode
w;bitree
*
p
=
T;do
{while
(
p
!=
NULL
)
{//向左子樹走w.ptr
=
p;
w.tag
=
L;
Push
(&S,w);p
=
p->lchild;}int
continue=1;
//繼續(xù)循環(huán)標(biāo)記while
(
continue
&&
!StackEmpty(&S)
)
{Pop
(&S,
w);
p
=
w.ptr;switch
(
w.tag
)
{
//判斷棧頂tag標(biāo)記case
L
:
w.tag
=
R;
Push
(&S,
w);continue
=
0;p
=
p->rchild;
break;case
R
:
cout
<<p->data
<<
endl;}}}
while
(
p
!=
NULL
||
!StackEmpty(&S)
);cout
<<
endl;}練習(xí):交換二叉樹各結(jié)點的左、右子樹(遞歸算法)void
unknown
(
bitree
*
T
){
bitree
*p
=
T,
*temp;if
(
p
!=
NULL
){
temp
=
p->lchild;p->lchild
=
p->rchild;p->rchild
=
temp;unknown
(p->lchild
);unknown
(
p->rchild
);}}·不用棧消去遞歸算法中的第二個遞歸語句void
unknown
(
bitree
*
T
){
bitree
*p
=
T,
*temp;while
(
p
!=
NULL
){
temp
=
p->lchild;p->lchild
=
p->rchild;p->rchild
=
temp;unknown
(p->lchild
);p
=
p->rchild;}}使用棧消去遞歸算法中的兩個遞歸語句void
unknown(bitree
*
T){
bitree
*p,
*temp;stack
*S;
SETNULL
(S);if
(
T
!=
NULL
){
push(S,
T);while
(
!
Empty(S)
){Pop(S,p);//棧中退出一個結(jié)點
temp=p->lchild;//交換子女
p->lchild=p->rchild;p->rchild
=
temp;if
(
p->rchild
!=
NULL
)push
(S,
p->rchild
);if
(p->lchild
!=
NULL
)push
(S,p->lchild
);}}}ltag=0,ltag=1,rtag=0,rtag=1,lchild為左子女指針lchild為前驅(qū)線索rchild為右子女指針rchild為后繼指針lchildrchilddataltagrtag·線索二叉樹(Threaded
Binary
Tree)結(jié)點結(jié)構(gòu)下面給出線索鏈表的形式說明:typedef
int
datatype
;typedef
struct
node{
int
ltag
,
rtag
;datatype
data
;struct
node
*lchild
,
*rchild
;}bithptr
;bithptr
*pre
;通過中序遍歷建立中序線索化二叉樹bithptr
*pre
=null;INTHREAD
(
bithptr
*p
){
if
(
p
!=
NULL
)//左子樹線索化{
INTHREAD
(
p->lchild
);if
(p->lchild
==
NULL
){
p->lchild
=
pre;p->ltag
=
1;}
//建立當(dāng)前結(jié)點的前驅(qū)線索if
(
pre
!=
NULL
&&pre->rchild
==
NULL
)
{pre->rchild
=
p;pre->rtag
=
1;}
//建立前驅(qū)結(jié)點的后繼線索pre
=
p;//前驅(qū)跟上當(dāng)前指針//遞歸,INTHREAD
(
p->rchild);右子樹線索化}}?樹的存儲結(jié)構(gòu)·雙親表示:以一組連續(xù)空間存儲樹的結(jié)點,同時在結(jié)點中附設(shè)一個指針,存放雙親結(jié)點在鏈表中的位置。樹與森林BACDdata0
1
2
3
4A
B
C
D
E5
6F
GEFGparent-1
0
0
0
113用雙親表示實現(xiàn)的樹定義#define
MaxSize//最大結(jié)點個數(shù)typedef
char
datatype;//結(jié)點數(shù)據(jù)//樹結(jié)點定義typedef
struct
{datatype
data;int
parent;}
TreeNode;typedef
TreeNode
Tree[MaxSize];
//樹AB
C
DE
F
G·左子女-右兄弟表示法第一種解決方案
等數(shù)量的鏈域data
child1
child2
child3childdABCDEFG空鏈域n(k-1)+1個結(jié)點結(jié)構(gòu)data
firstChild
nextSiblingAB
C
DE
F
G空鏈域n+1個第二種解決方案
樹的左子女-右兄弟表示(二叉鏈表表示)BCDGFEA用左子女-右兄弟表示實現(xiàn)的樹定義typedef
char
datatype;typedef
struct
node
{datatype
data;struct
node
*firstChild,
*nextSibling;}
TreeNode;typedef
TreeNode
*
Tree;(1)樹轉(zhuǎn)化成二叉樹的簡單方法保留結(jié)點與第一個孩子之間的連線,去掉其余連線;①在同胞兄弟之間加連線;②③順時針旋轉(zhuǎn)45度。以根結(jié)點為軸;左孩子不再旋轉(zhuǎn)。森林轉(zhuǎn)化成二叉樹①將森林中的每棵樹轉(zhuǎn)換成對應(yīng)的二叉樹;②將森林中已經(jīng)轉(zhuǎn)換成的二叉樹的各個根視為兄弟,各兄弟之間自第一棵樹根到最后一棵樹根之間加連線;③以第一棵樹的根為軸,順時針旋轉(zhuǎn)45度。T1
T2
T3A
F
HB
C
D
G
I
JE
KT1ABCDEGT2
T3F
HIKJABCEDHIFG3
棵樹的森林各棵樹的二叉樹表示K
J森林的二叉樹表示?森林與二叉樹的轉(zhuǎn)換樹的二叉樹表示:?樹的遍歷深度優(yōu)先遍歷先根次序遍歷后根次序遍歷AB
C
DE
F
GABCEDGF·深度優(yōu)先遍歷訪問根結(jié)點依次先根遍歷根的各棵 子樹樹先根遍歷ABEFCDG對應(yīng)二叉樹前序遍歷ABEFCDG
樹的先根遍歷結(jié)果與其對應(yīng)二叉樹表示的前序遍歷結(jié)果相同
樹的先根遍歷可以借助對應(yīng)二叉樹的前序遍歷算法實現(xiàn)ABCEDGF·樹的先根次序遍歷當(dāng)樹非空時
樹的后根遍歷可以借助對應(yīng)二叉樹的中序遍歷算法實現(xiàn)·樹的后根次序遍歷:當(dāng)樹非空時依次后根遍歷根的各棵BA子樹EC訪問根結(jié)點樹后根遍歷EFBCGDAFD對應(yīng)二叉樹中序遍歷EFBCGDAG樹的后根遍歷結(jié)果與其對應(yīng)二叉樹表示的中序遍歷結(jié)果相同二叉樹的計數(shù)由二叉樹的前序序列和中序序列可唯一地確定一棵二叉樹。例,前序序列{ABHFDECKG}和中序序列{HBDFAEKCG},構(gòu)造二叉樹過程如下:HBDFEKCGA
AEKCG
BH
DFKCGEKCGABH
DFEKCGABHFDEABHFDEABHFDCKG如果前序序列固定不變,給出不同的中序序列,可得到不同的二叉樹。5
81
12
6
2
63
4
7
3
7
89
4
5
9固定前序排列,選擇所有可能的中序排列,可以構(gòu)造多少種不同的二叉樹?例如, 有
3
個數(shù)據(jù){
1,
2,
3
},可得
5
種不同的二叉樹。它們的前序排列均為123,中序序列可能是
321
,
231,
213,
132,123.31
1
1
1
12
2
2
3
2
23
3
3具有n個結(jié)點不同形態(tài)的樹的數(shù)目和具有
n-1個結(jié)點互不相似的二叉樹的數(shù)目相同。有0個,1個,2個,3個結(jié)點的不同二叉樹如下b0
=1b1
=1b2
=2b3
=5b4
=14·計算具有n個結(jié)點的不同二叉樹的棵數(shù)最終結(jié)果:bibn-i-11哈夫曼樹(HuffmanTree)·路徑長度(Path
Length)兩個結(jié)點之間的路徑長度PL是連接兩結(jié)點的路徑上的分支數(shù)。樹的外部路徑長度是各葉結(jié)點(外結(jié)點)到根結(jié)點的路徑長度之和EPL。樹的內(nèi)部路徑長度是各非葉結(jié)點(內(nèi)結(jié)點)到根結(jié)點的路徑長度之和IPL。樹的路徑長度PL=EPL+IPL1234
5
6
782345678樹的外部路徑長度EPL=3*1+2*3=9樹的外部路徑長度EPL
=
1*1+2*1+3*1+4*1
=
101·帶權(quán)路徑長度(Weighted
Path
Length,WPL)二叉樹的帶權(quán)(外部)路徑長度是樹的各葉結(jié)點所帶的權(quán)值wi
與該結(jié)點到根的路徑長度li
的乘積的和。WPL
=
2*2+WPL
=
2*1+WPL
=
7*1+4*2+5*2+4*2+5*3+5*2+2*3+7*2
=
367*3
=
464*3
=
35242
455772
4
5
7帶權(quán)(外部)路徑長度達(dá)到最小哈夫曼樹
帶權(quán)路徑長度達(dá)到最小的二叉樹即為哈夫曼樹。在哈夫曼樹中,權(quán)值大的結(jié)點離根最近。哈夫曼算法(1)由給定的n個權(quán)值{w0,w1,w2,…,wn-1},構(gòu)造具有n棵擴充二叉樹的森林F={T0,T1,T2,…,Tn-1
},其中每棵擴充二叉樹Ti
只有一個帶權(quán)值wi
的根結(jié)點,其左、右子樹均為空。(2)重復(fù)以下步驟,直到F中僅剩下一棵樹為止:①在F中選取兩棵根結(jié)點的權(quán)值最小的擴充二叉樹, 做為左、右子樹構(gòu)造一棵新的二叉樹。置新的二叉樹的根結(jié)點的權(quán)值為其左、右子樹上根結(jié)點的權(quán)值之和。②在F中刪去這兩棵二叉樹。③把新的二叉樹加入F。F
:
{7}
{5}
{2}
{4}
F
:
{7}
{5}
{6}47
567
5
2初始
F:{7}{11}117
5
62
4合并{5}{6}5合并{7}{11}2462
4合并{2}{4}F
:
{18}187
11舉例哈夫曼樹的構(gòu)造過程Weightparentlchild
rch752407-1-1-115-1-1-122-1-1-134-1-1-14-1-1-15-1-1-16-1-1-1上例存儲結(jié)構(gòu)初態(tài)572
46Weightparentlchild
rch07-1-1-115-1-1-1224-1-1-1344-1-1-146-12-1-315-1-1-16-1-1-1p1p2i過程56Weightparentlchild
rch7
11p107-1-1-1155-1-1-1224-1-1344-1-1465-123511-1-1-416-1-1-12
4p2i52
467
11Weightparentlchild
rch56p1076-1-1-1155-1-1224-1-1344-1-14652311
6-118
-110-14-51p2i18終態(tài)int
n=20;//葉結(jié)點數(shù)int
m=2*n-1;//結(jié)點數(shù)typedef
struct
{float
weight;int
parent,
lchild,
rchild;}
hufmtree;hufmtree[m];哈夫曼樹的定義建立哈夫曼樹的算法void
CreateHuffmanTree
(
HuffmanTree
T,float
fr[
]
)
{for
(
int
i
=
0;
i
<
n;
i++
)T[i].weight
=
fr[i];for
(
i
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 三農(nóng)產(chǎn)品品質(zhì)管理方案
- 數(shù)據(jù)挖掘技術(shù)在業(yè)務(wù)智能化中的應(yīng)用作業(yè)指導(dǎo)書
- 2025年青海貨運從業(yè)資格證考試模擬試題及答案大全解析
- 2025年河北貨運從業(yè)資格證考試題技巧
- 2025年保山a2貨運從業(yè)資格證模擬考試
- 2025年遼寧貨運從業(yè)資格證考試資料
- 2025年伊春c1貨運上崗證模擬考試
- 2024年高中語文第四單元第13課宇宙的邊疆課時優(yōu)案1含解析新人教版必修3
- 粵教版道德與法治九年級上冊2.1.2《政府社會治理的主要職責(zé)》聽課評課記錄
- 初中班主任教師工作計劃
- 最新如何進(jìn)行隔代教育專業(yè)知識講座課件
- 當(dāng)前警察職務(wù)犯罪的特征、原因及防范,司法制度論文
- 奧特萊斯專題報告(經(jīng)典)-課件
- 《新制度經(jīng)濟學(xué)》配套教學(xué)課件
- 計算機文化基礎(chǔ)單元設(shè)計-windows
- 廣東省保安服務(wù)監(jiān)管信息系統(tǒng)用戶手冊(操作手冊)
- DNA 親子鑒定手冊 模板
- 深刻認(rèn)識民航安全工作的五個屬性
- DB33T 1233-2021 基坑工程地下連續(xù)墻技術(shù)規(guī)程
- 天津 建設(shè)工程委托監(jiān)理合同(示范文本)
- 運動技能學(xué)習(xí)與控制課件第六章注意與運動技能的控制
評論
0/150
提交評論