zoukankan      html  css  js  c++  java
  • 有根树的遍历和无根树的遍历

    有根树的遍历

    考察树的思想和dfs、bfs的实现,做不出来说明 dfs、bfs没有掌握 且 树的思想没有领悟。

    //有根树的遍历 
    #include <bits/stdc++.h>
    using namespace std;
    vector<int> to[200005];
    int n, a, vis[200005], q[200005];
    int cmp(int b, int c) { return b > c; }
    void ad(int u, int v) { to[u].push_back(v); }
    void dfs(int k) 
    {
        cout << k << ' ';
        for (int i = 0; i < to[k].size(); i++) {
            if (vis[to[k][i]] == 0) {
                vis[to[k][i]] = 1;
                dfs(to[k][i]);
            }
        }
    }
    void bfs(int k) 
    {
        int head = 1, tail = 1;
        q[tail++] = k;while (head < tail) {
            int now = q[head++];
            cout << now << " ";for (int i = 0; i < to[now].size(); i++) {
                if (vis[to[now][i]] == 0) {
                    vis[to[now][i]] = 1;
                    q[tail++] = to[now][i];
                }
            }
        }
    }
    int main() {
        cin >> n;
        for (int i = 1; i <= n - 1; i++) {
            cin >> a;
            ad(a, i);
            ad(i, a);
        }
        for (int i = 0; i < n; i++) sort(to[i].begin(), to[i].end(), cmp);
        vis[0] = 1;
        dfs(0);
        memset(vis, 0, sizeof(vis));
        cout << endl;
        vis[0] = 1;
        bfs(0);
        return 0;
    }

    无根树的遍历

     这个题和上一个有什么区别?没区别 =.=

    #include <bits/stdc++.h>
    using namespace std;
    vector<int> to[200005];
    int n, a, vis[200005], q[200005], start;
    int cmp(int b, int c) { return b > c; }
    void ad(int u, int v) { to[u].push_back(v); }
    void dfs(int k) 
    {
        cout << k << ' ';
        for (int i = 0; i < to[k].size(); i++) {
            if (vis[to[k][i]] == 0) {
                vis[to[k][i]] = 1;
                dfs(to[k][i]);
            }
        }
    }
    void bfs(int k) {
        int head = 1, tail = 1;
        q[tail++] = k;
        while (head < tail) {
            int now = q[head++];
            cout << now << " ";
            for (int i = 0; i < to[now].size(); i++) {
                if (vis[to[now][i]] == 0) {
                    vis[to[now][i]] = 1;
                    q[tail++] = to[now][i];
                }
            }
        }
    }
    int main() 
    {
        cin >> n;
        for (int i = 1; i <= n - 1; i++) {
            cin >> a;
            ad(a, i);
            ad(i, a);
        }
        cin >> start;
        for (int i = 0; i < n; i++) sort(to[i].begin(), to[i].end(), cmp);
        vis[start] = 1;
        dfs(start);
        memset(vis, 0, sizeof(vis));
        cout << endl;
        vis[start] = 1;
        bfs(start);
        return 0;
    }
    View Code
    满堂花醉三千客,一剑霜寒十四州
  • 相关阅读:
    Esper学习之二:事件类型
    Esper学习之一:Esper介绍
    在本机搭建mycat 单机环境,使用mariadb 伪集群
    spring mvc 跨域请求处理——spring 4.2 以上
    spring cache 详解
    Java抽象类和抽象方法例子
    拉灯问题(标准答案都是错的!)
    js实现模拟自动点击按钮,并且在10秒倒计时之后疯狂点击
    ADO.NET基本操作(CRUD、Procedure、Transaction)
    利用PowerDesigner绘制PDM生成SQL Server数据库
  • 原文地址:https://www.cnblogs.com/phemiku/p/11426569.html
Copyright © 2011-2022 走看看