字典序最小的中序遍历 树形DP

题目:https://ac.nowcoder.com/acm/problem/14506
题目大意:
图片说明
思路:
因为所有点的编号不同,那么我们考虑交换时,如果左子树的中序遍历的第一个编号>如果左子树的中序遍历的第一个编号。那么我们就交换。
所以记录每个点为根的子树的中序遍历的第一个编号就可以了。

#include <bits/stdc++.h>
using namespace std;

int l[2000005], r[2000005];
int ans=0;
int DFS(int u){
    int lson=u, rson=u;
    if(l[u]) lson=DFS(l[u]);
    if(r[u]) rson=DFS(r[u]);
    if(lson>rson){
        swap(l[u], r[u]);
        ans++;
    }
    return min(lson, rson);
}
void dfs(int u){
    if(l[u]) dfs(l[u]);
    printf("%d ", u);
    if(r[u]) dfs(r[u]);
}

int  main(){
    int n, root;
    while(~scanf("%d%d", &n, &root)){
        ans=0;
        for(int i=1; i<=n; i++){
            int x, y; scanf("%d%d", &x, &y);
            l[i]=x, r[i]=y;
        }
        DFS(root);
        printf("%d\n", ans);
        dfs(root);
        printf("\n");
    }

    return 0;
}
全部评论

相关推荐

头顶尖尖的程序员:我也是面了三四次才放平心态的。准备好自我介绍,不一定要背熟,可以记事本写下来读。全程控制语速,所有问题都先思考几秒,不要急着答,不要打断面试官说话。
点赞 评论 收藏
分享
06-12 17:46
门头沟学院 Java
运营你豪哥:来说重点: ​1.项目前置,时间倒序。​​ 2.​项目描述强化结果与量化效果(STAR原则里的R)。​​ ​3.个人技能精炼,明确掌握程度,突出核心。​​ ​4.增加强有力开头的个人总结部分。​​ 5.​优化教育背景(成绩排名)、合并奖项与活动。​​
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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