Software technology experimental class code base - two binary trees and Huffman coding

 

Software Technology Experiment Class Code

II. Huffman coding and binary tree traversal

Huffman coding

# include<stdio.h>
# include<stdlib.h>
# include<string.h>
# define n 6
# define m 2*n-1
# define Maxval 1
typedef char datatype;
typedef struct
{
	float weight;
	datatype data;
	int lchild, rchild, parent;
} hufmtree;
hufmtree tree[m];
typedef struct
{
	char bits[n];
	int start;
	datatype data;
} codetype;
codetype code[n];
HUFFMAN(hufmtree tree[])
{
	int i, j, p1, p2;
	char ch;
	float small1, small2, f;
	for (i = 0; i < m; i++)
	{
		tree[i].parent = 0;
		tree[i].lchild = 0;
		tree[i].rchild = 0;
		tree[i].weight = 0.0;
		tree[i].data = '0';
	}
	for (i = 0; i < n; i++)
	{
	//	scanf("%f ",&f);
		scanf("%f",&f);
		getchar(); 
		tree[i].weight = f;
		scanf("%c",&ch);
		tree[i].data = ch;
	}
	for (i = n; i < m; i++)
	{
		p1 = p2 = 0;
		small1 = small2 = Maxval;
		for (j = 0; j <=i - 1; j++)
			if (tree[j].parent == 0)
				if (tree[j].weight < small1)
				{
					small2 = small1;
					small1 = tree[j].weight;
					p2 = p1;
					p1 = j;
				}
				else if (tree[j].weight < small2)
				{
					small2 = tree[j].weight;
					p2 = j;
				}
		tree[p1].parent = i;
		tree[p2].parent = i;
		tree[i].lchild = p1;
		tree[i].rchild = p2;
		tree[i].weight = tree[p1].weight + tree[p2].weight;
	}
}
HUFFMANCODE(codetype code[], hufmtree tree[])
{
	int i, c, p, k;
	codetype cd;
	for (i = 0; i < n; i++)
	{
		cd.start = n;
		c = i;
		p = tree[c].parent;
		cd.data = tree[c].data;
		while (p != 0)
		{
			cd.start--;
			if (tree[p].lchild == c)
				cd.bits[cd.start] = '0';
			else cd.bits[cd.start] = '1';
			c = p;
			p = tree[c].parent;
		}
		code[i] = cd;
		printf("%c:", cd.data);
		for (k = cd.start; k < n; k++)
			printf("%c", cd.bits[k]);
		printf("\n");
	}
}
HUFFMANDECODE(codetype code[ ], hufmtree tree[ ])
{
	int i, c, p, b;
	int endflag = 2;
	i = m - 1;
	scanf("%1d", &b);
	while (b != endflag)
	{
		if (b == 0)i = tree[i].lchild;
		else i = tree[i].rchild;
		if (tree[i].rchild == 0)
		{
			putchar(code[i].data);
			i = m - 1;
		}
		scanf("%1d", &b);
	}
	if ((tree[i].lchild != 0) && (i != m - 1))
		printf("\nERROR\n");
}

void main()
{
	printf("输出结点的权值和结点字母,用空格隔开;\n");
	HUFFMAN(tree);
	printf("\n编码结果\n");
	HUFFMANCODE(code, tree);
	printf("\n开始译码,请输入密码;\n");
	HUFFMANDECODE(code, tree);
	printf("\n");
}

 Binary tree traversal

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxsize 1024
typedef char datatype;
typedef struct node
{
	datatype data;
	struct node *lchild, *rchild;
} bitree;
bitree *CREATTREE()
{
	char ch;
	bitree *Q[maxsize];
	int front, rear;
	bitree *root, *s;
	root = NULL;
	front = 1, rear = 0;
	printf("请输入二叉树的各节点,@表示虚结点,#表示结束:\n");
	scanf("%c",&ch);
	while(ch != '#')
	{
		putchar(ch);
		s = NULL;
		if( ch != '@')
		{
			s = (bitree* )malloc(sizeof(bitree));
			s->data = ch;
			s->lchild = NULL;
			s->rchild = NULL;
		}
		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;
			if(rear %2 == 1)
				front++;
		}
		scanf("%c",&ch);
	}
	return root;
}
void preorder(bitree *p)
{
	if(p!=NULL)
	{
		printf("%c ",p->data);
		preorder(p->lchild);
		preorder(p->rchild);
	}
	return ;
}
void inorder(bitree *p)
{
	if(p!=NULL)
	{
		inorder(p->lchild);
		printf("%c ",p->data);
		inorder(p->rchild);
	}
	return ;
}
void postorder(bitree *p)
{
	if(p != NULL)
	{
		postorder(p->lchild);
		postorder(p->rchild);
		printf("%c ",p->data);
	}
	return ;
}
int main()
{
	bitree *root;
	root = CREATTREE();
	printf("\n先序遍历如下:\n");
	preorder(root);
	printf("\n中序遍历如下:\n");
	inorder(root);
	printf("\n后序遍历如下:\n");
	postorder(root);
	 return 0;
}

 

Guess you like

Origin blog.csdn.net/CSDNsabo/article/details/91884382