c语言指数形式32e00,那些年写过的C语言代码,那些年上的课叫数据结构,艹

这篇博客介绍了二叉树的基本操作,包括先序、中序和后序遍历,并提供了C语言实现的代码。此外,还展示了哈夫曼树的创建及哈夫曼编码的生成过程,同样附带了C语言代码实现。通过示例展示了如何创建和遍历二叉树,以及如何构建和输出哈夫曼编码。
摘要由CSDN通过智能技术生成

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

二叉树的基本操作程序

#include

#include

typedef

struct node{ //二叉树结构

char data;

struct node *lc,*rc; //左右子树

}bt,*list;

/*

二叉树

A

/ \

B C

/ \ \

D

E F

/ / \

K G

H

input

ABDK000E00C0FG00H00

ouput

ABDKECFGH

KDBEACGFH

KDEBGHFCA

*/

int creat(list*root){ //创建一棵二叉树,root使用的是二维指针

char n;

scanf(" %c",&n); //注%C前面加空格是为了起间隔作用

scanf不读入空格

if (n=='0') //0为间隔

{

*root=NULL; return 0; //输入结束

}

*root=(list)malloc(sizeof(bt));

if (!*root) return 0;

(*root)->data=n;

creat(&(*root)->lc);

creat(&(*root)->rc);

return 1;

}

int

pre(list root){ //先序遍历

if (!root) return 0;

printf(" 《%c》",root->data);

pre(root->lc);

pre(root->rc);

return 1;

}

int

mid(list root){ //中序遍历

if (!root) return 0;

mid(root->lc);

printf(" 《%c》",root->data);

mid(root->rc);

return 1;

}

int

lat(list root){ //后序遍历

if (!root) return 0;

lat(root->lc);

lat(root->rc);

printf(" 《%c》",root->data);

return 1;

}

int

sumleaf(list root,int *cnt){ //求叶子节点的个数

if (root)

{

if ((!root->lc)&&(!root->rc))

{ (*cnt)++; }

sumleaf(root->lc,cnt);

sumleaf(root->rc,cnt);

return 1;

}

return 0;

}

void

main(){

list b,s,m;

int n,t=1;

char ch='\0';

printf("\n\n\n\n\n\n");

printf(" ************************二叉树*************************\n");

printf(" ******************以下是将演示二叉树*******************\n");

printf("

#######################################################\n");

printf(" *****************************A*************************\n");

printf(" ****************************/

\\************************\n");

printf(" ***************************B C***********************\n");

printf(" **************************/

\\ \\**********************\n");

printf(" *************************D E

F*********************\n");

printf(" ************************/ / \\********************\n");

printf(" ************************K G

H*******************\n");

printf("

*******************************************************\n");

printf("

#######################################################\n");

printf("输入顺序为:\n");

printf(" ABDK000E00C0FG00H00 \n");

printf("该二叉树的先序遍历结果将会是:《ABDKECFGH》\n");

printf("该二叉树的中序遍历结果将会是:《KDBEACGFH》\n");

printf("该二叉树的先序遍历结果将会是:《KDEBGHFCA》\n");

printf("该二叉树的子叶数为:4\n");

while(t){ //循环操作

printf("请输入一颗树:\n");

s=m=b=NULL; //二叉树的初始化

creat(&b);

printf("\n下面的是先序遍历的结果:\n"); pre(b);

printf("\n下面的是中序遍历的结果:\n"); mid(b);

printf("\n下面的是后序遍历的结果:\n"); lat(b);

printf("\n");

n=0;

sumleaf(b,&n); printf("叶子节点数为:《%d》\n",n);

}

}

哈夫曼树程序C语言代码

#include

#include

#define N 50 /*叶子结点数*/

#define M 2*N-1

/*树中结点总数*/

typedef struct

{

char data[5];

/*结点值*/

int

weight; /*权重*/

int

parent; /*双亲结点*/

int

lchild; /*左孩子结点*/

int

rchild; /*右孩子结点*/

} HTNode;

typedef struct

{

char

cd[N]; /*存放哈夫曼码*/

int start;

} HCode;

int n=4;

void CreateHT(HTNode ht[])

{

int

i,k,lnode,rnode;

int min1,min2;

for

(i=0;i<2*n-1;i++) /*所有结点的相关域置初值-1*/

ht[i].parent=ht[i].lchild=ht[i].rchild=-1;

for

(i=n;i<2*n-1;i++) /*构造哈夫曼树*/

{

min1=min2=32767; /*lnode和rnode为最小权重的两个结点位置*/

lnode=rnode=-1;

for

(k=0;k<=i-1;k++)

if

(ht[k].parent==-1) /*只在尚未构造二叉树的结点中查找*/

{

if

(ht[k].weight

{

min2=min1;rnode=lnode;

min1=ht[k].weight;lnode=k;

}

else if

(ht[k].weight

{

min2=ht[k].weight;rnode=k;

}

}

ht[lnode].parent=i;ht[rnode].parent=i;

ht[i].weight=ht[lnode].weight+ht[rnode].weight;

ht[i].lchild=lnode;ht[i].rchild=rnode;

}

}

void CreateHCode(HTNode ht[],HCode hcd[])

{

int i,f,c;

HCode hc;

for

(i=0;i

{

hc.start=n;c=i;

f=ht[i].parent;

while (f!=-1)

/*循序直到树根结点*/

{

if

(ht[f].lchild==c) /*处理左孩子结点*/

hc.cd[hc.start--]='0';

else /*处理右孩子结点*/

hc.cd[hc.start--]='1';

c=f;f=ht[f].parent;

}

hc.start++; /*start指向哈夫曼编码最开始字符*/

hcd[i]=hc;

}

}

void DispHCode(HTNode ht[],HCode hcd[])

{

int i,k;

int

sum=0,m=0,j;

printf(" 赫夫曼编码:\n"); /*输出哈夫曼编码*/

printf(" 字符 ");

printf(" 权重");

printf(" 编码\n");

for (i=0;i

{

j=0;

printf("

%s\t",ht[i].data);

printf("

%d\t",ht[i].weight);

for

(k=hcd[i].start;k<=n;k++)

{

printf("%c",hcd[i].cd[k]);

j++;

}

m+=ht[i].weight;

sum+=ht[i].weight*j;

printf("\n");

}

}

void main()

{

int i;

char *str[]={"A","B","C","D"};

int

fnum[]={7,5,2,4};

HTNode ht[M];

HCode hcd[N];

for

(i=0;i

{

strcpy(ht[i].data,str[i]);

ht[i].weight=fnum[i];

}

printf("\n");

CreateHT(ht);

CreateHCode(ht,hcd);

DispHCode(ht,hcd);

printf("\n");

}

哈夫曼编码实验截图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值