5.1树和二叉树
![20220112171835](https://img-blog.csdnimg.cn/img_convert/947c9ba2af3a82c1f33e24fb3b0cda77.png)
5.1.1 树的定义
![20220112171930](https://img-blog.csdnimg.cn/img_convert/e887234d35e5f78d4b912481e660c9c7.png)
![20220112172058](https://img-blog.csdnimg.cn/img_convert/b5b4b66449e68e431c51e391366c6d24.png)
![20220112172152](https://img-blog.csdnimg.cn/img_convert/a55bfb3b6a6a1908c6b4bddde5eb50ae.png)
5.1.2基本术语
![20220112172349](https://img-blog.csdnimg.cn/img_convert/316668745c8776439b7de07325128b8b.png)
![20220112172642](https://img-blog.csdnimg.cn/img_convert/e3436543f6294d047df4db96b724d9d8.png)
![20220112172828](https://img-blog.csdnimg.cn/img_convert/e22cf2a0f1ae6f101fdb0d47511bd00f.png)
5.1.3二叉树的定义
![20220112172944](https://img-blog.csdnimg.cn/img_convert/045779c6ca37b780a273b65c321b71a4.png)
![20220112173104](https://img-blog.csdnimg.cn/img_convert/34ef49b03206f6e7ef1ee94ed93e1bc6.png)
![20220113103915](https://img-blog.csdnimg.cn/img_convert/601e79279cc4b0a071891c211dd7f23e.png)
![20220113104036](https://img-blog.csdnimg.cn/img_convert/3b73388feb67977ae206722a05b4ef8c.png)
5种基本形态
![20220113104141](https://img-blog.csdnimg.cn/img_convert/50dae6e2b703343a82fe0962e9048bd8.png)
5.2案例引入
案例1∶数据压缩问题
![20220113104651](https://img-blog.csdnimg.cn/img_convert/89b72ff3178243e1a02f51269477836e.png)
案例2︰求解表达式的值
![20220113104607](https://img-blog.csdnimg.cn/img_convert/bc4e22f3b58e4ab87d32f3fa7fd032e7.png)
5.3抽象数据类型定义
![20220113104950](https://img-blog.csdnimg.cn/img_convert/a8d195c6ac9b37676cf1416790316f0c.png)
![20220113105103](https://img-blog.csdnimg.cn/img_convert/d6c040ab36234f6b55bf69975a86198a.png)
5.4二叉树的性质
性质1
![20220113105345](https://img-blog.csdnimg.cn/img_convert/5f95b591c776fac5a5ffd5b7073869a4.png)
![20220113105423](https://img-blog.csdnimg.cn/img_convert/2af9edce3877d38c9d230f85f27cacba.png)
性质2
![20220113105658](https://img-blog.csdnimg.cn/img_convert/f38513dc18e18474472b9f4ca76c1a2b.png)
性质3
![20220113110134](https://img-blog.csdnimg.cn/img_convert/4c92d55d9e14825c238021990297d783.png)
两种特殊形式的二叉树
![20220113110524](https://img-blog.csdnimg.cn/img_convert/315cc666fd8f9cf8ba5a1b3b3d18e1c8.png)
5.4.1满二叉树
![20220113110904](https://img-blog.csdnimg.cn/img_convert/c4dd2ba26ac1d400e57fb0f4d0a7d093.png)
![20220113111023](https://img-blog.csdnimg.cn/img_convert/284467bae5e6c0a846981c64272b9e94.png)
5.4.2完全二叉树
![20220113111219](https://img-blog.csdnimg.cn/img_convert/127838646f7d4460515bec9f2f733edf.png)
![20220113111432](https://img-blog.csdnimg.cn/img_convert/dc1e005254d7b86ac8f6747f827151b4.png)
![20220113111518](https://img-blog.csdnimg.cn/img_convert/6586cc63418013cb028fbca0bfdeda3d.png)
![20220113111720](https://img-blog.csdnimg.cn/img_convert/6a51a2386a6eb9db15d08d2b77c7099a.png)
性质4
![20220113112133](https://img-blog.csdnimg.cn/img_convert/8b4955bdcc753016763104f19c63fee6.png)
![20220113112250](https://img-blog.csdnimg.cn/img_convert/1da9bf07813a1ebb77a6ee07ad6bbdb0.png)
性质5
![20220113113429](https://img-blog.csdnimg.cn/img_convert/de8d48b9755db11668848086ce4605d3.png)
![20220113113556](https://img-blog.csdnimg.cn/img_convert/744f9f1f56a36dc7f60a569068b1ca8d.png)
5.5存储结构
![20220113113659](https://img-blog.csdnimg.cn/img_convert/7d61abf9a66e1fbdacc2d142b0378377.png)
5.5.1顺序
![20220113113932](https://img-blog.csdnimg.cn/img_convert/92b32aed0fe04a82e5199f83857ec9a3.png)
//二叉树顺序存储表示#define MAXTSIZE 100
Typedef TElemType SqBiTree[MAXSTIZE]
SqBiTree bt;
![20220113114238](https://img-blog.csdnimg.cn/img_convert/59e43a231afb6941268caafffc9d34c7.png)
![20220113114340](https://img-blog.csdnimg.cn/img_convert/bc9161a8a15f697a29024b61f26d034c.png)
![20220113114601](https://img-blog.csdnimg.cn/img_convert/b2cd377f3ecc0e070fb57ada9117f586.png)
5.5.2链式
二叉链表
![20220113114804](https://img-blog.csdnimg.cn/img_convert/25247057a2338dd7adf9c37afb4930a8.png)
typedef struct BiNode{
TElemType data;
struct BiNode *lchild, *rchild; //左右孩纸
}BiNode,*BiTree;
![20220113125117](https://img-blog.csdnimg.cn/img_convert/fa72513205b0cd56c2fadb7a26270f95.png)
![20220113130141](https://img-blog.csdnimg.cn/img_convert/622137e194b474fcb5b60fc0a567cf47.png)
三叉链表
![20220113130309](https://img-blog.csdnimg.cn/img_convert/c29341601572faaeab972f421a843c31.png)
typedef struct TriTNode{
TelemType data;
struct TriTNode *lchild,*parent,*rchild;
}TriTNode,*TriTree;
5.6遍历二叉树
![20220113131507](https://img-blog.csdnimg.cn/img_convert/56370920c0f2f2af11e67dfad51eac44.png)
5.6.1.遍历二叉树
![20220113132612](https://img-blog.csdnimg.cn/img_convert/c6d12c5547cf850a7185074929251041.png)
![20220113132822](https://img-blog.csdnimg.cn/img_convert/dbcae2363f9acb9847b78abae1f98947.png)
![20220113133000](https://img-blog.csdnimg.cn/img_convert/d138c96f60f270392d9941612b28be6c.png)
先序遍历
![20220113133107](https://img-blog.csdnimg.cn/img_convert/703601f4293ca0231d3df18c205f0fe8.png)
中序遍历
![20220113133240](https://img-blog.csdnimg.cn/img_convert/e69081dfe702fadd47889373d1e5d7b3.png)
后序遍历
![20220113133328](https://img-blog.csdnimg.cn/img_convert/cd5a1c34837d7bdf9e5cf2aec890c8bb.png)
![20220113133708](https://img-blog.csdnimg.cn/img_convert/a0be2ea319a693212bea5bbf236a3882.png)
![20220113134241](https://img-blog.csdnimg.cn/img_convert/c5a460672568259505218596e4b0fd76.png)
5.6.2遍历序列
![20220113134600](https://img-blog.csdnimg.cn/img_convert/e0ace7849945a349b5e3f49ad3ec3a9b.png)
例题1
![20220113135236](https://img-blog.csdnimg.cn/img_convert/7c813855e5cefe68ec3a768e5641f5e4.png)
![20220113135303](https://img-blog.csdnimg.cn/img_convert/40547f0a797c47c6cfb70c8a8c6748a8.png)
![20220113135330](https://img-blog.csdnimg.cn/img_convert/fbfe8d7668bacaeaf0e5f817039eb946.png)
例题2
![20220113140346](https://img-blog.csdnimg.cn/img_convert/34aef5f76d8621fb2dec63df81c02510.png)
5.6.3算法实现
【算法1】:先序
![20220113141512](https://img-blog.csdnimg.cn/img_convert/09733cb658c282c020fd7412159c4a08.png)
Status PreOrderTraverse(BiTree T){
if(T==NULL) return OK; //空二叉树
else{
visit(T); //访问根结点
PreOrderTraverse(T->lchild);//递归遍历左子树
PreOrderTraverse(T->rchild);//递归遍历右子树
}
}
void Pre(BiTree *T) {
if (T!=NULL) {
printf("%d\t",T->data);
pre(T->lchild);
pre(T->rchild);
}
}
![20220113142059](https://img-blog.csdnimg.cn/img_convert/eb85d557a1d02b7b0b8227c257236061.png)
【算法2】:中序
![20220113142401](https://img-blog.csdnimg.cn/img_convert/d8f64f253e2cb94c662146bc9b6d1494.png)
Status InOrderTraverse(BiTree T){
if(T==NULL) return OK;//空二叉树
else{
InOrderTraverse(T->lchild);//递归遍历左子树
visit(T);//访问根结点;
InOrderTraverse(T->rchild);//递归遍历右子树}
}
}
【算法3】:后序
![20220113143037](https://img-blog.csdnimg.cn/img_convert/7cf9711ebdc701bf63f1ad9d1f9dc4fe.png)
Status PostOrderTraverse(BiTree T){
if(T==NULL) return OK;//空二叉树
else{
PostOrderTraverse(T->lchild);//递归遍历左子树
PostOrderTraverse(T->rchild);//递归遍历右子树
visit(T);//访问根结点
}
}
算法分析
![20220113143423](https://img-blog.csdnimg.cn/img_convert/b66a1a51f0813db8001182a67d9f88a5.png)
![20220113143624](https://img-blog.csdnimg.cn/img_convert/e2a41194b2376d8987e010da71395344.png)
![20220113144238](https://img-blog.csdnimg.cn/img_convert/b0da74671431e6a41ec5d69a64b6305a.png)
【算法4】:中序非递归
![20220113164322](https://img-blog.csdnimg.cn/img_convert/c1bb4e4c673d7dc8f7fdc1c12e886195.png)
Status InOrderTraverse (BiTree T) {
BiTree p; InitStack(S); p=T;
while(p || !StackEmpty(S)) {
if(p) {
Push(S,p);
p = p->lchild;
}
else {
Pop(S,q);
printf(“%c”,q->data);
p= q->rchild;
}
}
return OK;
}
【算法5】:层次遍历
![20220113170345](https://img-blog.csdnimg.cn/img_convert/0b91810f13fbf0bdf7067cf933f0e2ee.png)
![20220113171523](https://img-blog.csdnimg.cn/img_convert/1d920686c89d70d3f9ac0dfd2393811c.png)
typedef struct{
BTNode data[MaxSize]; //存放队中元素
int front,rear; //队头和队尾指针
} SqQueue; //顺序循环队列类型
void LevelOrder(BTNode *b) {
BTNode *p; SqQueue *qu;
InitQueue(qu); //初始化队列
enQueue(qu,b); //根结点指针进入队列
while (!QueueEmpty(qu) ) { //队不为空,则循环
deQueue(qu,p); //出队结点p
printf("%c ", p->data); //访问结点p
if (p->lchild!=NULL) enQueue(qu,p->lchild); //有左孩子时将其进队
if (p->rchild!=NULL) enQueue(qu,p->rchild); //有右孩子时将其进队
}
}
5.6.4算法的应用
【算法6】:二叉树的建立
![20220113172443](https://img-blog.csdnimg.cn/img_convert/2f56777bb65f13a2e9afb13b8c4f5c40.png)
![20220113172819](https://img-blog.csdnimg.cn/img_convert/03a62acff6408180bf426ed63b07081c.png)
Status CreateBiTree(BiTree &T) {
scanf(&ch); //cin> >ch;
if (ch== “#”) T = NULL;
else {
if (!(T =(BiTNode *)malloc(sizeof(BiTNode))))
exit(OVERFLOW); //T=new BiTNode;
T->data = ch; //生成根结点
CreateBiTree(T->lchild);//构造左子树
CreateBiTree(T->rchild);//构造右子树
}
return OK;
}// CreateBiTree
【算法7】:复制
二叉树
![20220113173950](https://img-blog.csdnimg.cn/img_convert/7cebf1d144735c33deb162ef7438d737.png)
int Copy(BiTree T,BiTree &NewT){
if(T==NULL){//如果是空树返回0
NewT=NULL;return 0;
}
else {
NewT=new BiTNode;
NewT->data=T->data;
Copy(T->lChild,NewT->lchild);
Copy(T->rChild,NewT->rchild);
}
}
【算法8】:计算二叉树深度
int Depth( BiTree T){
if(T==NULL) return O;//如果是空树返回0
else {
m=Depth(T->lChild);
n =Depth(T->rChild);
if(m>n) return (m+1);
else return(n+1);
}
}
【算法9】:计算二叉树结点总数
![20220113190106](https://img-blog.csdnimg.cn/img_convert/755e7c58b343a2fb958d88fc47297302.png)
int NodeCount(BiTree T){
if(T == NULL)
return O;
else
return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}
【算法10】:计算二叉树叶子结点总数
![20220113190328](https://img-blog.csdnimg.cn/img_convert/11d2916b12609103f4cfb39d2a9a37a8.png)
int LeadCount(BiTree T){
if(T==NULL) //如果是空树返回0
return O;
if (T->lchild == NULL && T->rchild == NULL)
return 1; //如果是叶子结点返回1
else
return LeafCount(T- >lchild) +LeafCount(T->rchild);
}
5.7线索二叉树
![20220114065601](https://img-blog.csdnimg.cn/img_convert/4ccfdfb6aa8a343b9baf651e28331604.png)
![20220114065901](https://img-blog.csdnimg.cn/img_convert/9ce68abc596641e182f73d06c9628198.png)
![20220114070203](https://img-blog.csdnimg.cn/img_convert/5e027efb982d7bebc095744f68681a25.png)
![20220114070327](https://img-blog.csdnimg.cn/img_convert/bd9e6376a40873190f2b530cca4a81bb.png)
typedef struct BiThrNode{
int data;
int Itag, rtag;
struct BiThrNode *Ichild,rchild;
}BiThrNode,*BiThrTree ;
![20220114070624](https://img-blog.csdnimg.cn/img_convert/94266408afc3d741872bdbd337741bc6.png)
![20220114070932](https://img-blog.csdnimg.cn/img_convert/b764e437b68ed776c0e282a60afbc67f.png)
![20220114071017](https://img-blog.csdnimg.cn/img_convert/cb3d760745e06fb65eaa086d842c3f44.png)
![20220114071137](https://img-blog.csdnimg.cn/img_convert/0db6949ee757ae22acea9c25a1b370df.png)
![20220114071435](https://img-blog.csdnimg.cn/img_convert/99c20231c8dad83082f9f739355b9a9f.png)
5.8树和森林
![20220114071831](https://img-blog.csdnimg.cn/img_convert/fa40e8e832f1d8f753cc5466b0050d27.png)
5.8.1双亲表示法
![20220114072504](https://img-blog.csdnimg.cn/img_convert/5f074ae48d57827ce20de9c168481535.png)
![20220114075406](https://img-blog.csdnimg.cn/img_convert/e103bd7c47e0c50b2f5096d53f7b7478.png)
typedef struct PTNode {
TElemType data;
int parent; //双亲位置域
}PTNode;
#define MAX_TREE_SIZE 100
typedef struct {
PTNode nodes[MAX_TREE_SIZE];
int r, n; //根结点的位置和结点个数
}PTree;
5.8.2孩子链表
![20220114111213](https://img-blog.csdnimg.cn/img_convert/a012a466812ef40ae880175d93c3e73e.png)
![20220114081026](https://img-blog.csdnimg.cn/img_convert/1dcc915dd0725cf5b861ba70ad2ffd51.png)
typedef struct CTNode {
int child;
struct CTNode *next;
}*ChildPtr;
typedef struct {
TElemType data;
ChildPtr firstchild;//孩子链表头指针
}CTBox;
typedef struct {
CTBox nodes[MAX_TREE_SIZE];
int n, r;//结点数和根结点的位置
}CTree;
5.8.3孩子兄弟表示法
![20220114114609](https://img-blog.csdnimg.cn/img_convert/f2fb88e6c01977c27add863badfb2790.png)
typedef struct CSNode{
ElemType data;
struct CSNode *firstchild, *nextsibling;
}CSNode,*CSTree;
![20220114115030](https://img-blog.csdnimg.cn/img_convert/f837920ec40ceb7fc81250b8bacc367c.png)
5.8.4树与二叉树的转换
![20220114115751](https://img-blog.csdnimg.cn/img_convert/597e4af0d5d339df9dbf57dec7d76c62.png)
![20220114115722](https://img-blog.csdnimg.cn/img_convert/6b358ad18ca12ae449fc4c6932d78ff0.png)
![20220114120042](https://img-blog.csdnimg.cn/img_convert/ec64910ad05f0a5112f91dd9f766ab65.png)
![20220114120207](https://img-blog.csdnimg.cn/img_convert/8edd26250a028f1dded7c4bed1efa5be.png)
![20220114120309](https://img-blog.csdnimg.cn/img_convert/b1824cba1080839d9a0c669dc13999c1.png)
![20220114120452](https://img-blog.csdnimg.cn/img_convert/5edc0c06409b055ae0d9c55e9bdb1cfa.png)
5.8.5森林与二叉树的转化
![20220114120628](https://img-blog.csdnimg.cn/img_convert/be1a41d2132ff284b35e6153c29db68d.png)
![20220114120730](https://img-blog.csdnimg.cn/img_convert/feb223c211ac83d356152839ae1ddade.png)
![20220114120809](https://img-blog.csdnimg.cn/img_convert/76559e91edc87fe006a84d728fc13662.png)
![20220114120859](https://img-blog.csdnimg.cn/img_convert/a161c2e1abe7937ba4f515842ad3cd96.png)
5.8.6树与森林的遍历
![20220114121129](https://img-blog.csdnimg.cn/img_convert/64ca000461a50ae122f50cfe1cf734e8.png)
![20220114121330](https://img-blog.csdnimg.cn/img_convert/50b5008646856f28f1fe43721ffde7b0.png)
先序
![20220114121454](https://img-blog.csdnimg.cn/img_convert/7f93f8cb696ee3cfe18741ffdcc534e7.png)
中序
![20220114121525](https://img-blog.csdnimg.cn/img_convert/f2c45b10e25f13d9b74bbfe0528ca7fa.png)
![20220114121722](https://img-blog.csdnimg.cn/img_convert/4fc62dda987b686bac4fb15953553ae5.png)
5.9哈夫曼树及其应用
5.9.1基本概念
![20220114122615](https://img-blog.csdnimg.cn/img_convert/bb8689f6650aa5d44e32c812dc62dc78.png)
![20220114123241](https://img-blog.csdnimg.cn/img_convert/4de18b15f2e85e9e9d5a31cdf9c884bf.png)
![20220114123346](https://img-blog.csdnimg.cn/img_convert/70c2c3f4086b461c63d459c2a2f22526.png)
![20220114123829](https://img-blog.csdnimg.cn/img_convert/42cec813f459341d099f6c49bb7951af.png)
![20220114123952](https://img-blog.csdnimg.cn/img_convert/ca39c8265092781310bd877827f25c91.png)
![20220114124203](https://img-blog.csdnimg.cn/img_convert/a64346fda375d0f957d3aeff40bef391.png)
![20220114130854](https://img-blog.csdnimg.cn/img_convert/86f484d629b078d39674127b1b89cabf.png)
![20220114131010](https://img-blog.csdnimg.cn/img_convert/85afe833e7c6adb170da626387ee42bc.png)
![20220114131128](https://img-blog.csdnimg.cn/img_convert/0d37be2621a3b613e6d67450daf636fa.png)
5.9.2构造算法
![20220114131310](https://img-blog.csdnimg.cn/img_convert/f28085e7013bbf477769335d8e662cc7.png)
![20220114131501](https://img-blog.csdnimg.cn/img_convert/7e135cd63615fbf412c17f0bc6ba5a7a.png)
![20220114134614](https://img-blog.csdnimg.cn/img_convert/24722d2efe2b718bd3899bd0151cb3bf.png)
![20220114135318](https://img-blog.csdnimg.cn/img_convert/278a56cf097676ea4fa0adc7570232ca.png)
![20220114140702](https://img-blog.csdnimg.cn/img_convert/2f60002f58923e7401ef4d6a4a037815.png)
5.9.3算法实现
![20220114141239](https://img-blog.csdnimg.cn/img_convert/6bdc3f904281b2246e2c2bff69f637a7.png)
![20220114144957](https://img-blog.csdnimg.cn/img_convert/9133c90d3fad3a8362e11eb6b04e18f0.png)
![20220114204339](https://img-blog.csdnimg.cn/img_convert/eabdc42b594cbc9c717ec049dc9069ae.png)
typedef struct {
int weight;
int parent, lch, rch;
}HTNode,*HuffmanTree;
void CreatHuffmanTree (HuffmanTree HT, int n){//构造哈夫曼树——哈夫曼算法
if(n<=1) return;
m=2*n-1; //数组共2n-1个元素
HT=new HTNode[m+1]; //0号单元未用,HT[m]表示根结点
for(i=1;i<=m;++i){ //将2n-1个元素的lch、rch、parent置为0
HT[i].Ich=O; HT[i].rch=O; HT[i].parent=O;
}
for(i=1;i<=n;++i) cin>>HT[i].weight;//输入前n个元素的weight值
//初始化结束,下面开始建立哈夫曼树
for( i=n+1;i<=m; i++){ //合并产生n-1个结点-构造Huffman树
Select(HT, i-1,s1, s2); //在HT[k](1≤k≤i-1)中选择两个其双亲域为0,
//且权值最小的结点,并返回它们在HT中的序号s1和s2
HT[s1].parent=i; HT[s2].parent=i; //表示从F中删除s1,s2
HT[i].lch=s1; HT[i].rch=s2 ;
//s1,s2分别作为i的左右孩子
HT[i].weight=HT[s1].weight + HT[s2].weight;//i的权值为左右孩子权值之和
}
}
![20220114165721](https://img-blog.csdnimg.cn/img_convert/8ad592d5e7db08ae773663a02c7a75b8.png)
5.9.4哈夫曼编码
![20220114205139](https://img-blog.csdnimg.cn/img_convert/ae7f17c0612b39bbb517829026963cac.png)
![20220114205608](https://img-blog.csdnimg.cn/img_convert/58e984ce3a0b9e8b464b6bd959135aa6.png)
![20220114205801](https://img-blog.csdnimg.cn/img_convert/4bcf6d1a580f88d8237f991a57e7e31e.png)
![20220114210845](https://img-blog.csdnimg.cn/img_convert/df162d113e3700b52403b382df732076.png)
![20220114211015](https://img-blog.csdnimg.cn/img_convert/b7576398acc475d0e312d0499c627df5.png)
![20220114211049](https://img-blog.csdnimg.cn/img_convert/01c77db2ae4b25529dc16bcb2657f00c.png)
![20220114211139](https://img-blog.csdnimg.cn/img_convert/dba0b520e62433f22409b58e3f36dbf3.png)
![20220114212440](https://img-blog.csdnimg.cn/img_convert/875c8305c100f753a1554a306eaa8ad0.png)
void CreatHuffmanCode(HuffmanTree HT, HuffmanCode &HC, int n){
//从叶子到根逆向求每个字符的哈夫曼编码,存储在编码表HC中
HC=new char *[n+1]; //分配n个字符编码的头指针矢量
cd=new char [n]; //分配临时存放编码的动态数组空间
cd[n-1]= ‘1O’; //编码结束符
for(i=1; i<=n; ++i){ //逐个字符求哈夫曼编码
start=n-1; c=i; f=HT[i].parent;
while(f!=O){ //从叶子结点开始向上回溯,直到根结点
--start; //回溯一次start向前指一个位置
if (HT[f].Ilchild= =c) cd[start]= '0’ ; //结点c是f的左孩子,则生成代码0
else cd[start]= ‘1’ ; //结点c是f的右孩子,则生成代码1
c=f; f=HT[f].parent; //继续向上回溯
} //求出第i个字符的编码
HC[i]= new char [n-start]; //为第i个字符串编码分配空间
strcpy(HC[i],&cd[start]); //将求得的编码从临时空间cd复制到HC的当前行中
}
delete cd; //释放临时空间
}// CreatHuffanCode
5.9.5文件的编码和解码
![20220114213446](https://img-blog.csdnimg.cn/img_convert/675b36335f2e56377f31b86cef71ccaf.png)
![20220114215557](https://img-blog.csdnimg.cn/img_convert/dabb65ad436d230410f2ae6bd2c0e721.png)
![20220114215616](https://img-blog.csdnimg.cn/img_convert/cfaf99bec865fdb9ea3b3f663725907e.png)
![20220114215734](https://img-blog.csdnimg.cn/img_convert/ff7cec3027b9430cb6ca9d55d681a2e6.png)
![20220114215853](https://img-blog.csdnimg.cn/img_convert/f4b8710117ea1f65ffa22895fa385a7b.png)
1; i<=n; ++i){ //逐个字符求哈夫曼编码
start=n-1; c=i; f=HT[i].parent;
while(f!=O){ //从叶子结点开始向上回溯,直到根结点
–start; //回溯一次start向前指一个位置
if (HT[f].Ilchild= =c) cd[start]= '0’ ; //结点c是f的左孩子,则生成代码0
else cd[start]= ‘1’ ; //结点c是f的右孩子,则生成代码1
c=f; f=HT[f].parent; //继续向上回溯
} //求出第i个字符的编码
HC[i]= new char [n-start]; //为第i个字符串编码分配空间
strcpy(HC[i],&cd[start]); //将求得的编码从临时空间cd复制到HC的当前行中
}
delete cd; //释放临时空间
}// CreatHuffanCode
## 5.9.5文件的编码和解码
[外链图片转存中...(img-Eb60AhkD-1642168867104)]
[外链图片转存中...(img-ATRnHMgF-1642168867104)]
[外链图片转存中...(img-eWwpUqqr-1642168867105)]
[外链图片转存中...(img-JBLQcu4n-1642168867105)]
[外链图片转存中...(img-Uj4RLzFp-1642168867105)]