天梯赛 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

作者: 陈越

单位: 浙江大学

时间限制: 400 ms

内存限制: 64 MB

代码长度限制: 16 KB

根据给定序列建出二叉树,然后进行层序遍历。

#include<bits/stdc++.h>
#define MAX 125
using namespace std;

struct Node{   //二叉树建立
    int x,l,r;
}tree[MAX];
int h[MAX],z[MAX];
int c;

int find(int h[],int z[],int len){   //找中序的父节点
    for(int i=0;i<len;i++){
        if(z[i]==h[len-1]){
            return i;
        }
    }
}
int build(int h[],int z[],int len){   //建树
    if(len<=0) return -1;
    int k=find(h,z,len);
    c++;
    int f=c;
    tree[f].x=z[k];
    tree[f].l=build(h,z,k);
    tree[f].r=build(h+k,z+(k+1),len-(k+1));
    return f;
}
void bfs(int x){    //层序遍历
    int f=0,i;
    queue<int> q;
    q.push(x);
    while(q.size()){
        int x=tree[q.front()].x;
        int l=tree[q.front()].l;
        int r=tree[q.front()].r;
        if(f==0) f=1;
        else printf(" ");
        printf("%d",x);
        if(l>-1) q.push(l);
        if(r>-1) q.push(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;
}

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

时间: 2024-10-10 18:18:28

天梯赛 L2-006 树的遍历(序列建树)的相关文章

根据前序/后序遍历和中序遍历序列建树

根据前序遍历和中序遍历序列建树: 1 // 先序序列pre[preL,preR],中序序列in[inL,inR] 2 node* BuildTree(int preL,int preR,int inL,int inR){ 3 if(preL>preR){ 4 return NULL; 5 } 6 node *root=new node; 7 root->data=pre[preL]; 8 int k; 9 for(k=inL;in[k]!=pre[preL];k++){ 10 ; 11 } 1

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)//利用中序

二叉搜索树的后序遍历序列-剑指Offer

二叉搜索树的后序遍历序列 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 思路 后序遍历:左-->右-->根节点 二叉搜索树中,左子树的节点小于根节点,右子树的节点大于根节点 递归调用,根据大小区别左右子树,若在右子树中发现小于根节点的节点,就不是后续遍历序列 举一反三:如果要求处理一棵二叉树的遍历序列,我们可以先找到二叉树的根节点,再基于根节点把整棵树的遍历序列拆分成左子树对应的子序列和右子

天梯赛L2-006. 树的遍历

L2-006. 树的遍历 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(<=30),是二叉树中结点的个数.第二行给出其后序遍历序列.第三行给出其中序遍历序列.数字间以空格分隔. 输出格式: 在一行中输出该树的层序遍历的序列.数字间以1个空格分隔,行首尾不得有多余空格. 输入样例: 7 2

团体程序设计天梯赛 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

通过树的先序和中序遍历序列来构造二叉树

题目:给出一棵二叉树的先序和中序遍历的序列,构造出该二叉树. 思路一:采用分治法. 1)取先序遍历序列的第一个值,用该值构造根结点,,然后在中序遍历序列中查找与该元素相等的值,这样就可以把序列分为三部分:左子树(如果有).根结点和右子树(如果有). 2)将两个序列都分成三部分,这样就分别形成了根结点的左子树和右子树的先序遍历和后序遍历的序列. 3)重复1)和2)步骤,直至所有结点都处理完就可以完整构成一颗二叉树了. 根据分治法构造二叉树的代码实现: TreeNode *buildTree(vec

L2-006. 树的遍历

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

【题解】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