哈夫曼树的建立
用一个结构体指针数组存储待合并的二叉树的根节点地址。每次合并两个根结点权值最小二叉树,将其中一个指针修改为新树根节点,另一个置为NULL,直到只剩一棵树。问题:在初始化n棵树的根节点时,为何给结构体指针指向的成员变量赋值后,在循环体里和循环体外输出的结果会不一样。
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
//结点
typedef struct HTNode{
ElemType data;
struct HTNode *lchild,*rchild;
}HTNode,*HTree;
//选择两个权值最小的结点
void Select(HTree *nodes,int *n1,int *n2,int n){
for(int i=0;i<n;i++){
if(nodes!=NULL){
if((*n1)==-1||nodes->data<nodes[(*n1)]->data)
(*n1)=i;
}
}
for(int i=0;i<n;i++){
if(nodes!=NULL&&i!=(*n1)){
if((*n2)==-1||nodes->data<nodes[(*n2)]->data)
(*n2)=i;
}
}
}
void CreateHT(HTree *HT){
int n;
scanf("%d",&n);
//创建一个结构体指针数组,每个元素为HTree结构体指针类型
HTree *nodes=(HTree*)malloc(sizeof(HTree));
for(int i=0;i<n;i++){
//生成原始二叉树
nodes=(HTree)malloc(sizeof(HTNode));
scanf("%d",&(nodes->data));
printf("%d,%d ",nodes,nodes->data); //测试1
nodes->lchild=NULL;
nodes->rchild=NULL;
}
//测试2
printf("\n-----------\n");
for(int i=0;i<n;i++){
printf("%d,%d ",nodes,nodes->data);
}
//进行n-1次合并,找到两个权值最小的
for(int i=1;i<n;i++){
int n1=-1,n2=-1;
Select(nodes,&n1,&n2,n);
HTree p=(HTree)malloc(sizeof(HTNode));
p->data=nodes->data+nodes->data;
p->lchild=nodes;
p->rchild=nodes;
nodes=p;
nodes=NULL;
}
//找到根节点
for(int i=0;i<n;i++)
if(nodes!=NULL){
(*HT)=nodes;
break;
}
}
int main(){
HTree HT;
CreateHT(&HT);
return 1;
}
错误案例:
输入:
5
1 2 3 4 5
输出:
12325952,1 12325984,2 12326016,3 12326048,4 12326080,5
-----------
12325952,12326080 12325984,2 12326016,3 12326048,4 12326080,5
我运行出来是一样的
5
1 2 3 4 5
10773736,1 10770232,2 10770288,3 10815312,4 10815368,5
-----------
10773736,1 10770232,2 10770288,3 10815312,4 10815368,5
页:
[1]