哈夫曼树的构造与遍历----树-二叉树-扩充二叉树-哈夫曼树

//树-二叉树-扩充二叉树-哈夫曼树
#include<stdio.h>
#include<stdlib.h>
typedef struct btnode {
	int element;
	struct btnode* Lchild, * Rchild;
}BTNode;
typedef struct btree {
	struct btnode* Root;
}BTree;
BTNode* NewNode() {
	BTNode* p = (BTNode*)malloc(sizeof(BTNode));
	return p;
}
void CreateBT(BTree* bt) {
	bt->Root = NULL;
}
void MakeBT(BTree* bt, int x, BTree* lt, BTree* rt) {
	BTNode* p = NewNode();
	p->element = x;
	p->Rchild = rt->Root;
	p->Lchild = lt->Root;
	lt->Root = rt->Root = NULL;
	bt->Root = p;
}
void BreakBT(BTree* bt, BTree* lt, BTree* rt) {
	BTNode* p = bt->Root;
	if (p) {
		lt->Root = p->Lchild;
		rt->Root = p->Rchild;
		bt->Root = NULL;
		free(p);
	}
}
void Visit(BTNode* p) {
	printf("%d ", p->element);
}
void PreOrd(void (*Visit)(BTNode* u), BTNode* t) {
	if (t) {
		(*Visit)(t);
		PreOrd(Visit, t->Lchild);
		PreOrd(Visit, t->Rchild);
	}
}
void InOrd(void (*Visit)(BTNode* u), BTNode* t) {
	if (t) {
		InOrd(Visit, t->Lchild);
		(*Visit)(t);
		InOrd(Visit, t->Rchild);
	}
}
void PostOrd(void (*Visit)(BTNode* u), BTNode* t) {
	if (t) {
		PostOrd(Visit, t->Lchild);
		PostOrd(Visit, t->Rchild);
		(*Visit)(t);
	}
}
void PreOrder(BTree* bt, void  (*Visit)(BTNode* u)) {
	PreOrd(Visit, bt->Root);
}
void InOrder(BTree* bt, void  (*Visit)(BTNode* u)) {
	InOrd(Visit, bt->Root);
}
void PostOrder(BTree* bt, void  (*Visit)(BTNode* u)) {
	PostOrd(Visit, bt->Root);
}
void LevelOrd(BTree bt) {
	BTNode* p;
	BTNode* queue[256];
	int front = -1, rear = -1;
	p = bt.Root;
	rear++;
	queue[rear] = p;
	while (front != rear) {
		front++;
		p = queue[front];
		printf("%d ", p->element);
		if (p->Lchild != NULL) {
			rear++;
			queue[rear] = p->Lchild;
		}
		if (p->Rchild != NULL) {
			rear++;
			queue[rear] = p->Rchild;
		}
	}
	printf("\n");
}
void Fmin(BTree ht[], int**minIndx1, int** minIndex2, int k) {
	int i, j, k1, k2;
	int temp, temp2;
	temp = ht[0].Root->element;
	k1 = 0;
	for (i = 0; i <= k; i++) {
		if (temp > ht[i].Root->element) {
			temp = ht[i].Root->element;
			k1 = i;
		}
	}
	*minIndx1 = &k1;
	if (k1 != 0) {
		temp2 = ht[0].Root->element;
		k2 = 0;
		for (j = 0; j <= k; j++) {
			if (k1 == j) {
				continue;
			}
			if (temp2 > ht[j].Root->element) {
				temp2 = ht[j].Root->element;
				k2 = j;
			}
		}
	}
	else {
		temp2 = ht[1].Root->element;
		k2 = 1;
		for (j = 1; j <= k; j++) {
			if (temp2 > ht[j].Root->element) {
				temp2 = ht[j].Root->element;
				k2 = j;
			}
		}
	}
	*minIndex2 = &k2;
}
BTree CreateHFMTree(int w[],int n) {
	BTree ht[256];
	int i, k, *k1 = 0, *k2 = 0, k2Temp;
	BTree* zero;
	zero = (BTree*)malloc(sizeof(BTree));
	CreateBT(zero);
	for (i = 0; i < n; i++) {
		MakeBT(&ht[i], w[i], zero, zero);  //初始化森林F,其元素都是一个个二叉树,其左右孩子都为NULL
	}
	for (k = n - 1; k > 0; k--) {
		Fmin(ht,&k1,&k2, k);   //返回根节点值最小的二叉树在BTree ht[]中的索引值
		k2Temp = *k2; //指针K1, K2会在下一步运算中被清空,这里要保存 k2 所指向的索引值
		MakeBT(&ht[*k1], ht[*k1].Root->element + ht[*k2].Root->element, &ht[*k1], &ht[*k2]);
		ht[k2Temp] = ht[k];
	}
	return ht[0];
}

void main() {
	BTree bt;
	int w[] = {9,11,13,3,5,12};
	
	bt = CreateHFMTree(w,sizeof(w)/sizeof(int));
	PreOrder(&bt, Visit);
	printf("\n");
	LevelOrd(bt);
	printf("\n");
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值