该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
二叉树的基本操作程序
#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");
}
哈夫曼编码实验截图