天梯赛L2-006. 树的遍历

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;
}

原文地址:https://www.cnblogs.com/yzm10/p/8640974.html

时间: 2024-10-11 23:51:39

天梯赛L2-006. 树的遍历的相关文章

PTA天梯赛L2

L2-001 紧急救援 题意:就是给你一张n<500的图:让你求最短路径,最短路条数,以及路径: 做法,先用dijkstra求最短路,然后dfs找最短路条数,以及点权的最大值: 一般dfs不就可以解决这个问题吗,像n皇后求次数,注意回溯即可: 那如何dfs确定这条路是最短路径呢?贪心思想,枚举每一个邻居,如果满足   dis[y.v]==dis[x]+y.w 说明当前邻居 通过这个点可以一直是最短路径,这样dfs下去,如果碰到d就return掉: 主要是没有想到用dfs求最短路径条数,然后注意回

GPTL—练习集—006树的遍历

#include<bits/stdc++.h> using namespace std; typedef int daTp;//datatype typedef struct BTNode *position; typedef position BTree; const int MAXN=30; struct BTNode { daTp data; position lChild,rChild; }; BTree build(daTp in[],daTp post[],int n)//利用中序

团体程序设计天梯赛 L2-006. 树的遍历 L2-011. 玩转二叉树

L2-006. 树的遍历 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <stdbool.h> 5 6 struct node 7 { 8 long left,right; 9 }tree[10000]; 10 11 long a[31],b[31]; 12 13 void work(long l,long r,long p,long q,long fa

天梯赛 L2-006 树的遍历(序列建树)

L2-006 树的遍历 (25 分) 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数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 作者: 陈越 单

L2-006. 树的遍历

2016年团体程序设计天梯赛-模拟赛 给定中序遍历和后序遍历求前序遍历.给前序遍历和中序遍历求后序遍历这样类型的题目,可以先构造成一颗二叉树,然后...就好办了 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(<=30),是二叉树中结点的个数.第二行给出其后序遍历序列.第三行给出其中序遍历序列.数字间以空格分隔. 输出格式: 在一行中输出该树的层序遍历的序列.数字间以1个空格分隔,行首尾不得有多余空格. 输

PAT 团体程序设计天梯赛-练习集 题解(凑零钱,堆栈,社交集群)

开始准备cccc(cry)天梯赛了,第一周训练题,把官网挂出的训练题刷完了,对pat有了一点点的熟悉感. L1-1  就不说了... L1-2 打印沙漏 一个变量保存空格数,一个变量保存沙漏符号数,打印就行了,但这题话说wrong好几次啊,坑点是沙漏符号后面不打印空格,orz... <span style="font-size:14px;">#include<iostream> #include<stdio.h> #include<math.h

【题解】PAT团体程序设计天梯赛 - 模拟赛

由于本人愚笨,最后一题实在无力AC,于是只有前14题的题解Orz 总的来说,这次模拟赛的题目不算难,前14题基本上一眼就有思路,但是某些题写起来确实不太容易,编码复杂度有点高~ L1-1 N个数求和 设计一个分数类,重载加法运算符,注意要约分,用欧几里得算法求个最大公约数即可. 1 #include <cstdio> 2 3 long long abs(long long x) 4 { 5 return x < 0 ? -x : x; 6 } 7 8 long long gcd(long

javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题

赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支构成这两个结点之间的路径. ② 路径长度:结点路径上的分支数目称为路径长度. ③ 树的路径长度:从树根到每一个结点的路径长度之和. 以下图为例: A到F :结点路径 AEF : 路径长度(即边的数目) 2 : 树的路径长度:3*1+5*2+2*3=19: ④ 结点的带权路径长度:从该结点的到树的根结

POJ2255 Tree Recovery 【树的遍历】

Tree Recovery Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11365   Accepted: 7128 Description Little Valentine liked playing with binary trees very much. Her favorite game was constructing randomly looking binary trees with capital le