马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
用一个结构体指针数组存储待合并的二叉树的根节点地址。每次合并两个根结点权值最小二叉树,将其中一个指针修改为新树根节点,另一个置为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[i]!=NULL){
if((*n1)==-1||nodes[i]->data<nodes[(*n1)]->data)
(*n1)=i;
}
}
for(int i=0;i<n;i++){
if(nodes[i]!=NULL&&i!=(*n1)){
if((*n2)==-1||nodes[i]->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[i]=(HTree)malloc(sizeof(HTNode));
scanf("%d",&(nodes[i]->data));
printf("%d,%d ",nodes[i],nodes[i]->data); //测试1
nodes[i]->lchild=NULL;
nodes[i]->rchild=NULL;
}
//测试2
printf("\n-----------\n");
for(int i=0;i<n;i++){
printf("%d,%d ",nodes[i],nodes[i]->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[n1]->data+nodes[n2]->data;
p->lchild=nodes[n1];
p->rchild=nodes[n2];
nodes[n1]=p;
nodes[n2]=NULL;
}
//找到根节点
for(int i=0;i<n;i++)
if(nodes[i]!=NULL){
(*HT)=nodes[i];
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
|