HLG2040二叉树遍历已知前中,求后

二叉树的遍历
Time Limit: 1000 MS Memory Limit: 32768 K
Total Submit: 60(34 users) Total Accepted: 34(30 users) Rating: Special Judge: No
Description
给出一棵二叉树的中序和前序遍历,输出它的后序遍历。
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

Source
2014 Winter Holiday Contest 5

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;

int n,num=0;
int kmp(int root,int str2[])
{
    int s=0;
    while(1)
    {
        if(str2[s]==root)
            return s;
        s++;
    }
    return 0;
}
void calculate(int m,int str1[],int str2[],int str3[] )
{
    if(m<=0)
        return ;
        int len=kmp(str1[0],str2);
    calculate(len,str1+1,str2,str3);
    calculate(m-len-1,str1+len+1,str2+len+1,str3);
    str3[num++]=str1[0];
}
int main()
{
        int n;
    int str1[105],str2[105],str3[105];
    while(scanf("%d",&n)!=EOF)
    {
        num=0;
        memset(str1,0,sizeof(str1));
        memset(str2,0,sizeof(str2));
        memset(str3,0,sizeof(str3));
        for(int i=0;i<n;i++)
            scanf("%d",&str2[i]);
        for(int i=0;i<n;i++)
            scanf("%d",&str1[i]);
        calculate(n,str1,str2,str3);
        for(int i=0;i<n;i++)
            printf("%d ",str3[i]);
            printf("\n");
    }
    return 0;
}

时间: 2024-08-09 06:19:50

HLG2040二叉树遍历已知前中,求后的相关文章

二叉树遍历 已知中序后序遍历求前序遍历

已知中序.后序遍历求前序遍历的方法和已知前序.中序遍历求后序遍历的方法类似寻找根节点, 然后把中序遍历分成左右两个子树,有如此不断递归.很多文章介绍,不再累述. #include <iostream> #include <cstdio> #include <queue> #include <cstring> using namespace std; const int MAXN = 100; struct Node { char value; Node *l

二叉树遍历 ——已知后序,中序求层序 A1020.(25)

若直接DFS递归求解,会栈溢出 #include <cstdio> #include <cstring> #include <queue> #include <algorithm> using namespace std; const int maxn=50; struct node{ int data; node* lchild; node* rchild; }; int pre[maxn],in[maxn],post[maxn];//先序,中序,后序 i

递归非递归的二叉树遍历(递归前中后,非递归前中后,层次遍历,凹入打印法等)

由于所有的递归算法都可以借助于堆栈转换成循环结构的非递归算法.方法一:形式化模拟转换.方法二:根据要求解问题的特点设计借助于堆栈的循环结构算法.而此次正好是利用第二种按方法求解. 1.1非递归前序遍历: 首先利用下图来设计非递归前序遍历算法思想: 堆栈结构体如下: #define size 100 typedef struct { DataType data[size]; int tag[100]; //这个是在非递归后序中用到 int top : }SeqStack : (1)初始化设置一个堆

已知前序中序求后序-二叉树

writer:pprp 思路很容易理解,但是实现还是有一点难度,容易错 参考书目:<算法竞赛宝典> 代码如下: //已知前序中序,求后序 #include <iostream> using namespace std; //a是前序,b是中序 void hwg(string a,string b) { int ll,lr; for(unsigned int i = 0; i < b.length(); i++) { if(a[0] == b[i]) //找到根节点 { ll

POJ 2828 poj 2828 Buy Tickets 【树状数组,已知前n项和为K,返回n值】

题目链接:http://poj.org/problem?id=2828 在一个队列中,一个人想要插队,告诉你每个新来的人会插在i个人后面,求出最后的队列. 如果我们用模拟的话,那么时间复杂度肯定是超了:想想,如果我们逆序,那么最后来的人的位置一定是固定的,这样的话,我们将问题转化成逆序扫描给出数据,插在i个人后面这个数据就变成了在这个人前面需要留出多少个空位.如此我们只需要用树状数组记录前n项总共有多少个空位,每扫描一个数据,就找出能使得他前面正好有i个空位. 这题用树状数组或者线段树都可以,今

已知三点求圆心与半径

已知三点求圆心与半径  [email protected] http://blog.csdn.net/kezunhai 在计算机图像图形学中,经常会用到求圆心或圆半径的情况,本文介绍一种已知三个点求圆心和圆半径的方法(当然三个点不能共线,共线的三个点不能构成圆). 原理:相互连接三个点,选取其中的任意两条直线,通过对这两条直线的中心做垂线,两条垂线的交点就是圆心,以此点为圆心,以此点到任意一点的距离为半径画圆. 三个点分别计为pt1, pt2, pt3:取直线p1p2和p1p3(也可以取其他直线

二叉树遍历(先序、中序、后序)

二叉树的遍历(递归与非递归) 遍历:traversal 递归:recursion 栈----------回溯----------递归 栈和回溯有关 本文讨论二叉树的常见遍历方式的代码(Java)实现,包括 前序(preorder).中序(inorder).后序(postorder).层序(level order), 进一步考虑递归和非递归的实现方式. 递归的实现方法相对简单,但由于递归的执行方式每次都会产生一个新的方法调用栈,如果递归层级较深,会造成较大的内存开销, 相比之下,非递归的方式则可以

算法实验-二叉树的创建和前序-中序-后序-层次 遍历

对于二叉树的创建我是利用先序遍历的序列进行创建 能够对于树节点的内容我定义为char型变量 '0'为空,即此处的节点不存在 头文件 Tree.h //链式二叉树的头文件 #pragma once #include<iostream> #include<queue> using namespace std; class BinaryTreeNode { public: char data; BinaryTreeNode *leftChild,*rightChild; BinaryTr

Sql Server 在已知表中插入、删除、修改某一列操作

--1.向已有表中增加一列 ALTER TABLE TableName ADD ColumnName VARCHAR(20) NULL --2.删除表中的某一列 ALTER TABLE TableName DROP COLUMN ColumnName --3.修改某一列的数据类型 ALTER TABLE TableName ALTER COLUMN ColumnName INT 2.查询当年或者当月的数据 1.查询当年的数据 SELECT * FROM UserInfo WHERE YEAR(R