描述
在数据结构中,遍历是二叉树最重要的操作之一。所谓遍历(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 }