csp认证考试 202312-3 树上搜索 c语言解答

目录

csp认证考试 202312-3 树上搜索 c语言解答

题目

解析

代码



考试 202312-3 树上搜索 c语言解答

题目:

解析:

我认为这道题就是树结构的搜索算法,对树进行类似遍历,递归实现。如果对树状数据结构不了解的可以去学习以下相关的数据结构和操作思想,然后我这里用的C语言写的,但是我的代码提交会爆0,就是会因为编译错误而没有分,但是在本地devC++编译是没有问题的,然后还没有得到解决,要是有大佬知道怎么办,还请指教指教!!!非常感谢

下面是我的代码:

代码

#include<stdio.h>
#define N 100   //对列大小
typedef struct Node{
	int wi;
	int pre;
	int next[2];
	
}Node;

int minNode(int T,Node C[]);   //计算树的每一个节点的相对权重,并返回最小的节点地址编号
int sumNode(int T,Node C[]);   //计算树T的所有节点的权重总的
void input(int T,int dui[],int *q);   //入队
void output(int *e,int dui[],int *p);  //出队
void shuchu(int T,int Q,Node C[],int done[]);
int main ()
{
	int n,m;
	scanf("%d %d",&n,&m);  //n和m分别表示类别数量和问题的数量
	
	Node Class[2000]={};  //创建类别数组
	int i;
	for(i=0;i<n;i++)   
	{
		scanf("%d",&(Class[i].wi));
		Class[i].next[0]=0;
		Class[i].next[1]=0;
	}
	Class[0].pre=0;  //第一个当作树根,没有上级节点,创建树结构
	for(i=1;i<n;i++)   
	{
		scanf("%d",&(Class[i].pre));
		if(Class[Class[i].pre-1].next[0]==0)
			Class[Class[i].pre-1].next[0]=i+1;
		else
			Class[Class[i].pre-1].next[1]=i+1;
	}
	
	int Q[100];
	for(i=0;i<m;i++)
	{
		scanf("%d",&Q[i]);
	}
	
	for(i=0;i<m;i++)
	{
		int done[2000]={0};
		shuchu(1,Q[i],Class,done);
		printf("\n");
	}
	
	return 0;
}

void shuchu(int T,int Q,Node C[],int done[])
{
	if(T!=0)
	{
		int min =minNode(T,C);
		if(done[min-1]==0)
		{
			done[min-1]=1;
			printf("%d ",min);
		}
		
		if(min==Q)
		{
			if(C[min-1].next[0]==0&&C[min-1].next[1]==0)
				return ;
			shuchu(min,Q,C,done);
			
		}
		else
		{
			Node Cl[2000];
			for (int i = 0; i < 2000; i++)
			{  
                Cl[i] = C[i]; // 直接复制结构  
            }  
			if(Cl[C[min-1].pre-1].next[0]==min)
				Cl[C[min-1].pre-1].next[0]=0;
			if(Cl[C[min-1].pre-1].next[1]==min)
				Cl[C[min-1].pre-1].next[1]=0;
			
			shuchu(T,Q,Cl,done);
		}
	}
}
int minNode(int T,Node C[])
{
	int min=T;
	int sum=sumNode(T,C);
	int mins=sum;
	
	int dui[N]={-1}; //创建队列
	int p=0,q=0;   //p为对头,q为队尾
	
	input(T,dui,&q);  //T树根入队  
	
	while(p!=q)
	{
		int e=0;
		output(&e,dui,&p);
		if(C[e-1].next[0]!=0)
			input(C[e-1].next[0],dui,&q);
		if(C[e-1].next[1]!=0)
			input(C[e-1].next[1],dui,&q);
		
		int s=0;
		s=sumNode(e,C);
		s=sum-2*s;
		if(s<0)
			s=-s;
		if(s<mins)
		{
			min=e;
			mins=s;
		}
	}
	return min;
}

int sumNode(int T,Node C[])
{
	int sum=0;
	if(T==0)
		return 0;
	sum=C[T-1].wi+sumNode(C[T-1].next[0],C)+sumNode(C[T-1].next[1],C);
	return sum;
}

void input(int T,int dui[],int *q)
{
	dui[*q]=T;
	*q=(*q+1)%N;
}

void output(int *e,int dui[],int *p)
{
	*e=dui[*p];
	*p=(*p+1)%N;
}

这两天一直有其他的事情在忙,导致没有更新,这个代码我弄了好久了,但是提交一直报编译错误,不知怎么办,求求大佬指导!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咔拉西

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值