首页 > 其他 > 详细

有根树的遍历和无根树的遍历

时间:2019-08-28 22:27:09      阅读:116      评论:0      收藏:0      [点我收藏+]

有根树的遍历

技术分享图片

考察树的思想和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

 

有根树的遍历和无根树的遍历

原文:https://www.cnblogs.com/phemiku/p/11426569.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!