Skip to content

M27928: 遍历树

adjacency list, dfs, http://cs101.openjudge.cn/practice/27928/

思路:对每个节点,将它与所有子节点的值一起按从小到大排序,先递归遍历比它小的子节点,最后输出自己,这样整棵树按规则完成遍历。

cpp
#include <iostream>
#include <map>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;

void dfs(int u, map<int, vector<int>>& son) {

    vector<int> tmp = son[u];
    tmp.push_back(u);
    sort(tmp.begin(), tmp.end());
    
    for (int v : tmp) {
        if (v == u) {
            cout << u << "\n";  
        } else {
            dfs(v, son);       
        }
    }
}

int main() {
    int n;
    cin >> n;

    map<int, vector<int>> son;  
    set<int> all_nodes;         
    set<int> non_roots;         


    for (int i = 0; i < n; ++i) {
        int parent;
        cin >> parent;
        all_nodes.insert(parent);
        string line;
        getline(cin, line);  
        int num = 0;
        bool has_num = false;


        for (char c : line) {
            if (isdigit(c)) {
                num = num * 10 + (c - '0');
                has_num = true;
            } else if (has_num) {
                son[parent].push_back(num);
                non_roots.insert(num);
                all_nodes.insert(num);
                num = 0;
                has_num = false;
            }
        }
        if (has_num) { 
            son[parent].push_back(num);
            non_roots.insert(num);
            all_nodes.insert(num);
        }
    }


    vector<int> roots;
    for (int x : all_nodes)
        if (!non_roots.count(x))
            roots.push_back(x);

    sort(roots.begin(), roots.end());


    for (int r : roots)
        dfs(r, son);

    return 0;
}