1. 程式人生 > >天梯賽L2-006. 樹的遍歷

天梯賽L2-006. 樹的遍歷

文本對比 鍵值 inpu 多余 sizeof stdlib.h 文本 urn tps

L2-006. 樹的遍歷

時間限制 400 ms 內存限制 65536 kB 代碼長度限制 8000 B 判題程序 Standard 作者 陳越

給定一棵二叉樹的後序遍歷和中序遍歷,請你輸出其層序遍歷的序列。這裏假設鍵值都是互不相等的正整數。

輸入格式:

輸入第一行給出一個正整數N(<=30),是二叉樹中結點的個數。第二行給出其後序遍歷序列。第三行給出其中序遍歷序列。數字間以空格分隔。

輸出格式:

在一行中輸出該樹的層序遍歷的序列。數字間以1個空格分隔,行首尾不得有多余空格。

輸入樣例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
輸出樣例:
4 1 6 3 5 7 2

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<algorithm>
#define
MAX 125 using namespace std; struct Node{ int x,l,r; }tree[MAX]; int h[MAX],z[MAX]; int c; int build(int h[],int z[],int len){ int k,i; if(len<=0) return -1; for(i=0;i<len;i++){ if(z[i]==h[len-1]){ k=i; break; } } c
++; int root=c; tree[root].x=z[k]; tree[root].l=build(h,z,k); tree[root].r=build(h+k,z+k+1,len-k-1); return root; } void bfs(int x){ int f=0,i; queue<int> q; q.push(x); while(q.size()){ if(f==0){ printf("%d",tree[q.front()].x); f=1; } else printf(" %d",tree[q.front()].x); if(tree[q.front()].l>-1) q.push(tree[q.front()].l); if(tree[q.front()].r>-1) q.push(tree[q.front()].r); q.pop(); } } int main() { int n,i,j; scanf("%d",&n); for(i=0;i<n;i++){ scanf("%d",&h[i]); } for(i=0;i<n;i++){ scanf("%d",&z[i]); } c=0; build(h,z,n); bfs(1); return 0; }

二叉樹的遍歷

HRBUST - 2040

給出一棵二叉樹的中序和前序遍歷,輸出它的後序遍歷。

Input

本題有多組數據,輸入處理到文件結束。

每組數據的第一行包括一個整數n,表示這棵二叉樹一共有n個節點。

接下來的一行每行包括n個整數,表示這棵樹的中序遍歷。

接下來的一行每行包括n個整數,表示這棵樹的前序遍歷。

3<= n <= 100

Output

每組輸出包括一行,表示這棵樹的後序遍歷。

Sample Input

7
4 2 5 1 6 3 7

1 2 4 5 3 6 7

Sample Output

4 5 2 6 7 3 1

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<algorithm>
#define MAX 405
using namespace std;

struct Node{
    int x,l,r;
}tree[MAX];
int q[MAX],z[MAX];
int c;
int build(int q[],int z[],int len){
    int k,i;
    if(len<=0) return -1;
    for(i=0;i<len;i++){
        if(z[i]==q[0]){
            k=i;
            break;
        }
    }
    c++;
    int root=c;
    tree[root].x=z[k];
    tree[root].l=build(q+1,z,k);
    tree[root].r=build(q+k+1,z+k+1,len-k-1);
    return root;
}
void dfs(int x){
    int i;
    if(x==-1) return;
    dfs(tree[x].l);
    dfs(tree[x].r);
    printf("%d ",tree[x].x);
}
int main()
{
    int n,i,j;
    while(~scanf("%d",&n)){
        memset(tree,0,sizeof(tree));
        for(i=0;i<n;i++){
            scanf("%d",&z[i]);
        }
        for(i=0;i<n;i++){
            scanf("%d",&q[i]);
        }
        c=0;
        build(q,z,n);
        dfs(1);
        printf("\n");
    }
    return 0;
}

天梯賽L2-006. 樹的遍歷