#include<stdio.h>
#include<malloc.h>
#define max 100
struct tree {
char node;
int num;
tree* left;
tree* right;
};
tree* createhuffman(int a[], char c[], int n)
{
tree**b;
tree* q=NULL;
b = new tree * [n];
int i, j;
for (i = 0; i< n; i++) {
b[i] = new tree;
b[i]->num = a[i]; b[i]->node = c[i]; b[i]->left = b[i]->right = NULL;
}
for (i = 1; i <n; i++)
{
int k1 = -1,k2=0;
for (j = 0; j< n; j++) {
if (b[j] != NULL && k1 == -1) {
k1 = j; continue;
}
if (b[j] != NULL) {
k2 = j; break;
}
}
for (j = k2; j < n; j++) {
if (b[j] != NULL) {
if (b[j] -> num< b[k1] -> num) {
k2 = k1; k1 = j;
}
else if (b[j] -> num < b[k2] -> num) {
k2 = j;
}
}
}
q = new tree;
q -> num = b[k1] ->num + b[k2] ->num;
q ->left = b[k1]; q ->right = b[k2];
b[k1] = q; b[k2] = NULL;
}
delete[]b;
return q;
}
static int a[10];
void haffmancoding(tree* t, int len)
{
if (t != NULL) {
if (t ->left == NULL &&t ->right == NULL)
{
printf("结点%c 权值:%d 编码:",t->node,t->num);
for (int i = 0; i < len; i++)
{
printf("%d",a[i]);
}
printf("\n");
}
else {
a[len] = 0; haffmancoding(t ->left,len + 1);
a[len] = 1; haffmancoding(t ->right,len + 1);
}
}}
void preorder(tree* t)
{
if (t != NULL) {
printf("%c", t->node);
preorder(t->left);
preorder(t->right);
}
}
void inorder(tree* t) {
if (t != NULL) {
inorder(t->left);
printf("%c", t->node);
inorder(t->right);
}
}
void postorder(tree*t) {
if (t != NULL) {
postorder(t->left);
postorder(t->right);
printf("%c", t->node);
}
}
void levelorder(tree* t)
{
tree* q[max];
int front = 0, rear = 0;
tree* p;
if (t!=NULL) {
rear = (rear + 1) % max;
q[rear] = t;
}
while (front!=rear)
{
front = (front + 1) % max;
p = q[front];
printf("%c", p->node);
if (p->left != NULL) {
rear = (rear + 1) % max;
q[rear] = p->left;
}
if (p->right != NULL) {
rear = (rear + 1) % max;
q[rear] = p->right;
}
}
}
int main() {
int a[] = { 2,5,8,9,12,16 };
char c[] = {'A','B','C','D','E','F'};
tree* t = NULL;
int n;
n = sizeof(a)/sizeof(a[0]);
t = createhuffman(a, c, n);
haffmancoding(t, 0);
printf("前序遍历:");
preorder(t);
printf("\n");
printf("中序遍历:");
inorder(t);
printf("\n");
printf("后序遍历:");
postorder(t);
printf("\n");
printf("层次遍历:");
levelorder(t);
printf("\n");
}
输出前序中序这些遍历怎么会出现这样情况?
不delete 掉b 试试?