|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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
|
|