您现在的位置是:首页 >其他 >学习总结2.9网站首页其他

学习总结2.9

哇哈哈712 2025-04-18 00:01:02
简介学习总结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;
}

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。