05-树7 堆中的路径(25 分)

#include<stdio.h>
#include<stdlib.h> 
#include<malloc.h>

#define Max 1000
typedef struct heap *hp;
struct heap{
	int *data;
	//int size; 为什么size会变化 
};


void creat(hp H,int n,int m)   //创建最小堆  H->size在传递过程中的值会变化,为什么?传递的不是地址吗?不相当于引用吗? 
{
	int i;
	H->data[m]=n;   //插入放在最后的位置 
	for(i=m;H->data[i]<H->data[i/2];i=i/2){   //向上找到应该插入的位置            
		int x=H->data[i/2];                  //不必交换位置的,可以在找到位置后再进行插入,当然在路径上的节点会往下移 
		H->data[i/2]=H->data[i];
		H->data[i]=x;
	}
}

int main()
{
	hp H=(hp)malloc(sizeof(hp));
	H->data=(int *)malloc((Max+1)*sizeof(int));
	H->data[0]=-10001;          //哨兵,相当于0节点必定为根结点,这样在循环比较时就不会多加i>=0之类的条件了, 
	int N,M,i,n;
	scanf("%d %d",&N,&M);
	for(i=1;i<=N;i++){      //建立最小堆,插入法,如果用先顺序存储在数组中,再进行调整建堆,则不满足题目的要求,因为堆的结构并不唯一 
		scanf("%d",&n);
		creat(H,n,i);
	}
	for(i=0;i<M;i++){       //根据输入的位置输出路径, 
		scanf("%d",&n);
		for(n;n>1;n=n/2)printf("%d ",H->data[n]);   //最后必定会输出根结点 ,所以在n=2,3时就退出循环,使输出满足要求 
		printf("%d\n",H->data[1]);
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值