描述
在数据结构中,遍历是二叉树最重要的操作之一。所谓遍历(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
2
输入
输入有多组数据,第一行有一个整数n,表示有n组数据。每组数据两行,每行均是由a-z的字符组成的字符串,每个字母表示一个结点。其顺序,分别为树的中序遍历和前序遍历。长度小于27.
输出
对于每组数据,输出一行,树的后序遍历。
样例输入
2
dbgeafc
abdegcf
lnixu
xnliu
样例输出
dgebfca
linux
#include <iostream> #include <algorithm> using namespace std; #include <cstdio> #include <string> #include <cstring> int a[1005]; int t; string s,ss; int create(int preleft,int preright,int inleft,int inright) { int i,j,k; for(i=inleft;i<=inright;i++){ if(ss[i]==s[preleft]) break; } //用中序遍历找出根左右边的元素 int left=i-inleft; int right=inright-i; if(left>0){ create(preleft+1,preleft+left-1,inleft,left+inleft-1); }//左边有元素 if(right>0){ create(preleft+left+1,preright,inleft+left+1,inright); }//右边有元素 cout<<s[preleft]; //输出根 } int main() { int n,m,i,j,k; scanf("%d",&n); while(n--){ cin>>ss>>s; create(0,s.length()-1,0,ss.length()-1); cout<<"\n"; } }