1. 程式人生 > 其它 >【專題複習1:樹的遍歷】1004、1020

【專題複習1:樹的遍歷】1004、1020

1004

1004

#include <bits/stdc++.h>

using namespace std;
vector<int> G[101];
int leaf[101];
int maxh;
void DFS(int root,int h)
{
    maxh=max(maxh,h);
    if(G[root].size()==0){
        leaf[h]++;
        return;
    }
    for(int i=0;i<G[root].size();i++)
        DFS(G[root][i],h+1);
}
int main()
{
    int n,m,id,k,child;
    cin>>n>>m;
    for(int i=0;i<m;i++){
        cin>>id>>k;
        for(int j=0;j<k;j++){
            cin>>child;
            G[id].push_back(child);
        }
    }
    DFS(1,1);
    for(int i=1;i<=maxh;i++){
        if(i!=1) cout<<" ";
        cout<<leaf[i];
    }
    return 0;
}

1020

1020

#include <bits/stdc++.h>

using namespace std;
struct node
{
    int data;
    node* lc;
    node* rc;
};
vector<int> post,in;

int n,num=0;
node* create(int pl,int pr,int il,int ir)
{
    if(pl>pr) return nullptr;
    node* r=new node;
    r->data=post[pr];
    int i=0;
    while(in[i]!=post[pr]) i++;
    r->lc=create(pl,pl+i-il-1,il,i-1);
    r->rc=create(pl+i-il,pr-1,i+1,ir);
    return r;
}
void bfs(node* root)
{
    queue<node*> q;
    q.push(root);
    while(!q.empty()){
        node* now=q.front();
        q.pop();
        cout<<now->data;
        num++;
        if(num<n) cout<<" ";
        if(now->lc!=nullptr)
            q.push(now->lc);
        if(now->rc!=nullptr)
            q.push(now->rc);
    }
}
int main()
{
    #ifdef ONLINE_JUDGE
#else
    freopen("1.txt", "r", stdin);
#endif
    cin>>n;
    post.resize(n);in.resize(n);
    for(int i=0;i<n;i++)
        cin>>post[i];
    for(int i=0;i<n;i++)
        cin>>in[i];
    node* root=create(0,n-1,0,n-1);
    bfs(root);
    return 0;
}

不理解為何這種寫法編譯沒錯卻提示段錯誤

#include <bits/stdc++.h>

using namespace std;
struct node
{
    int data;
    node* lc;
    node* rc;
};
vector<int> post,in;
node* root;
int n,num=0;
void create(int pl,int pr,int il,int ir,node* &root)
{
    if(pl>pr) return ;
    root->data=post[pr];
    int i=0;
    while(in[i]!=post[pr]) i++;
    create(pl,pl+i-il-1,il,i-1,root->lc);
    create(pl+i-il,pr-1,i+1,ir,root->rc);
}
void bfs()
{
    queue<node*> q;
    q.push(root);
    while(!q.empty()){
        node* now=q.front();
        q.pop();
        cout<<now->data;
        num++;
        if(num<n) cout<<" ";
        if(now->lc!=nullptr)
            q.push(now->lc);
        if(now->rc!=nullptr)
            q.push(now->rc);
    }
}
int main()
{
    #ifdef ONLINE_JUDGE
#else
    freopen("1.txt", "r", stdin);
#endif
    cin>>n;
    post.resize(n);in.resize(n);
    for(int i=0;i<n;i++)
        cin>>post[i];
    for(int i=0;i<n;i++)
        cin>>in[i];
    create(0,n-1,0,n-1,root);
    bfs();
    return 0;
}

本文來自部落格園,作者:勇往直前的力量,轉載請註明原文連結:https://www.cnblogs.com/moonlight1999/p/15933777.html