前置知识:
- 前序遍历:根左右
- 中序遍历:左根右
- 后序遍历:左右根
- 层序遍历:从上到下从左到右依次遍历所有的节点。
因此我们在前序和中序,后序遍历中使用递归输出。层序遍历使用bfs
题目描述:
假定一棵二叉树的每个结点都用一个大写字母描述。
给定这棵二叉树的前序遍历和中序遍历,求其后序遍历。
输入格式
输入包含多组测试数据。
每组数据占两行,每行包含一个大写字母构成的字符串,第一行表示二叉树的前序遍历,第二行表示二叉树的中序遍历。
输出格式
每组数据输出一行,一个字符串,表示二叉树的后序遍历。
数据范围
输入字符串的长度均不超过 2626。
输入样例:
ABC
BAC
FDXEAG
XDEFAG
输出样例:
BCA
XEDGAF
难度:简单 |
时/空限制:1s / 64MB |
总通过数:628 |
总尝试数:748 |
来源:华中科技大学考研机试题 |
算法标签 |
//不建树的做法
//参考大佬的方法
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
string pre,in;
void dfs(string a,string b)
{
//两个参数的目的是找到根节点,以及根节点的下标.
if(b.size()&&a.size())
{
char k=a[0];
int root=b.find(k);
//后序遍历
dfs(a.substr(1,root),b.substr(0,root));//遍历左子树
dfs(a.substr(root+1),b.substr(root+1));//遍历右子树
cout<<k;//输出根节点.
//中序遍历:只用改变遍历顺序即可
dfs(a.substr(1,root),b.substr(0,root));//遍历左子树
cout<<k;//输出根节点.
dfs(a.substr(root+1),b.substr(root+1));//遍历右子树
//同理前序遍历只要先输出根节点,之后遍历左右子树。
}
}
int main()
{
while(cin>>pre>>in)
{
dfs(pre,in);
puts("");
}
return 0;
}
下面讲述层序遍历,层序遍历最为麻烦,应当先建树,后bfs输出
一个二叉树,树中每个节点的权值互不相同。
现在给出它的后序遍历和中序遍历,请你输出它的层序遍历。
输入格式
第一行包含整数 NN,表示二叉树的节点数。
第二行包含 NN 个整数,表示二叉树的后序遍历。
第三行包含 NN 个整数,表示二叉树的中序遍历。
输出格式
输出一行 NN 个整数,表示二叉树的层序遍历。
数据范围
1≤N≤301≤N≤30,
官方并未给出各节点权值的取值范围,为方便起见,在本网站范围取为 1∼N1∼N。
输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例:
4 1 6 3 5 7 2
#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#include <queue>
using namespace std;
const int N = 40;
int n;
int ptorder[N],inorder[N];
unordered_map<int,int>l,r,pos;
//根据后序和中序遍历建树
//同理前序和中序遍历也同样的方法建树。
int build(int il,int ir,int li,int lr)
{
int root=ptorder[lr];
int k=pos[ptorder[lr]];
if(il<k) l[root]=build(il,k-1,li,k-1-il+li);
if(ir>k) r[root]=build(k+1,ir,k-il+li,lr-1);
return root;
}
//bfs输出
void bfs(int x)
{
queue<int>qu;
qu.push(x);
while(qu.size())
{
auto t=qu.front();
cout<<t<<' ';
qu.pop();
if(l.count(t)) qu.push(l[t]);
if(r.count(t)) qu.push(r[t]);
}
}
int main()
{
scanf("%d", &n);
for(int i=1;i<=n;i++)
scanf("%d",&ptorder[i]);
for(int i=1;i<=n;i++)
{
scanf("%d",&inorder[i]);
pos[inorder[i]]=i;
}
build(1,n,1,n);
bfs(pos[ptorder[n]]);
return 0;
}