题解 | 先序遍历、中序遍历和后序遍历

先序遍历、中序遍历和后序遍历

https://www.nowcoder.com/practice/15fdb346838545d0b272e43957e1cb2a

按先中后的顺序遍历就行了,因为是有向边,所以入度为0的为树的根

vector<vector<int>>e(N);
int d[N];
void dfs1(int x){//root left right
    cout<<x<<" ";
    if(e[x].empty())return ;
    sort(e[x].begin(),e[x].end());
    if(e[x].size()==1){
        dfs1(e[x][0]);
    }else{
        dfs1(e[x][0]);
        dfs1(e[x][1]);
    }
}
void dfs2(int x){//left root right
    if(e[x].empty()){
        cout<<x<<" ";
        return ;
    }
    if(e[x].size()==1){
        if(e[x][0]>x){
            dfs2(e[x][0]);
            cout<<x<<" ";
        }else{
            cout<<x<<" ";
            dfs2(e[x][0]);
        }
    }else{
        dfs2(e[x][0]);
        cout<<x<<" ";
        dfs2(e[x][1]);
    }
}
void dfs3(int x){//left root right
    if(e[x].empty()){
        cout<<x<<" ";
        return ;
    }
    if(e[x].size()==1){
        dfs3(e[x][0]);
        cout<<x<<" ";
    }else{
        dfs3(e[x][0]);
        dfs3(e[x][1]);
        cout<<x<<" ";
    }
}
void solve(){
    int n;
    cin>>n;
    for(int i=1;i<n;i++){
        int u,v;
        cin>>u>>v;
        e[u].push_back(v);
        d[v]++;
    }
    int root;
    for(int i=1;i<=n;i++){
        if(d[i]==0)root=i;
    }
    dfs1(root);cout<<'\n';
    dfs2(root);cout<<'\n';
    dfs3(root);
}   

全部评论

相关推荐

不愿透露姓名的神秘牛友
2025-12-12 19:18
wxg 开发 24Kx17 其他
不太迷人的反派_:得看背景,本科24,比我工作三年都高了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务