目录
考试 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;
}
这两天一直有其他的事情在忙,导致没有更新,这个代码我弄了好久了,但是提交一直报编译错误,不知怎么办,求求大佬指导!!!