您现在的位置是:首页 >其他 >学习总结2.9网站首页其他
学习总结2.9
简介学习总结2.9
记录每个节点的左右叶子节点及其价值,将每个节点的父亲节点和叶子结点确定,通过循环将每个节点放在循环中,又通过循环来dfs,如果当前节点有父亲节点,就先遍历父亲节点,其次是其左右叶子节点
通过visit数组来判断节点有没有被遍历过,如有则停止当前深搜,未有则继续深搜
#include <stdio.h>
#include <string.h>
#define max 105
typedef struct{
int left,right,father,value;
}Tree;
Tree d[max];
int n,sum;
int ans=1000005;
int vis[max];//当前节点是否被遍历
void dfs(int step,int pos){
sum+=step*d[pos].value;
int fa=d[pos].father,l=d[pos].left,r=d[pos].right;
if(fa!=0&&vis[fa]==0){//若存在父亲节点且未被遍历
vis[fa]=1;
dfs(step+1,fa);
}
if(l!=0&&vis[l]==0){//若存在左节点且未被遍历
vis[l]=1;
dfs(step+1,l);
}
if(r!=0&&vis[r]==0){//若存在右节点且未被遍历
vis[r]=1;
dfs(step+1,r);
}
}
int main()
{
int n;
scanf("%d", &n);
for(int i=1;i<=n;i++){
scanf("%d %d %d",&d[i].value,&d[i].left,&d[i].right);
d[d[i].left].father=i;
d[d[i].right].father=i;//定义左右节点的父亲节点
}
for(int i=1;i<=n;i++){
sum=0;
memset(vis,0,sizeof(vis));//重置每次遍历
vis[i]=1;//标记当前节点已被访问
dfs(0,i);
ans=(ans>sum)?sum:ans;//寻找最小距离和
}
printf("%d
",ans);
return 0;
}
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。