TZOJ 3209 后序遍历(已知中序前序求后序)

描述

在数据结构中,遍历是二叉树最重要的操作之一。所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。

这里给出三种遍历算法。

1.中序遍历的递归算法定义:
     若二叉树非空,则依次执行如下操作:
         (1)遍历左子树;
         (2)访问根结点;
         (3)遍历右子树。
2.前序遍历的递归算法定义:
    若二叉树非空,则依次执行如下操作:
         (1) 访问根结点;
         (2) 遍历左子树;
         (3) 遍历右子树。
3.后序遍历得递归算法定义:
    若二叉树非空,则依次执行如下操作:
         (1)遍历左子树;
         (2)遍历右子树;
         (3)访问根结点。
现在给出一个二叉树的中序遍历和前序遍历。求它的后序遍历。

样例中的二叉树如下:

     a                      x
/ /
b c n u
/ / /
d e f l i
/
g

输入

输入有多组数据,第一行有一个整数n,表示有n组数据。每组数据两行,每行均是由a-z的字符组成的字符串,每个字母表示一个结点。其顺序,分别为树的中序遍历和前序遍历。长度小于27.

输出

对于每组数据,输出一行,树的后序遍历。

样例输入

2
dbgeafc
abdegcf
lnixu
xnliu

样例输出

dgebfca
linux
题意

已知中序前序求后序

题解

输出后序可以直接在递归里实现,算是有了个新操作

代码

 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 
 5 string In,Per;
 6 void build(int L1,int R1,int L2,int R2)
 7 {
 8     if(L1>R1)return;
 9     int root=Per[L2];
10     int p=L1;
11     while(In[p]!=Per[L2])p++;
12     int cnt=p-L1;
13     //cout<<root;//前序
14     build(L1,p-1,L2+1,L2+cnt);
15     //cout<<root;//中序
16     build(p+1,R1,L2+cnt+1,R2);
17     cout<<root;//后序
18 }
19 int main()
20 {
21     int t;
22     cin>>t;
23     while(t--)
24     {
25         cin>>In>>Per;
26         int n=In.size()-1;
27         build(0,n,0,n);
28         cout<<endl;
29     }
30     return 0;
31 }
原文地址:https://www.cnblogs.com/taozi1115402474/p/8548080.html