Description
对于二叉树T,可以递归定义它的先序遍历、中序遍历和后序遍历如下: PreOrder(T)=T的根节点+PreOrder(T的左子树)+PreOrder(T的右子树) InOrder(T)=InOrder(T的左子树)+T的根节点+InOrder(T的右子树) PostOrder(T)=PostOrder(T的左子树)+PostOrder(T的右子树)+T的根节点 其中加号表示字符串连接运算。例如,对下图所示的二叉树,先序遍历为DBACEGF,中序遍历为ABCDEFG。
输入一棵二叉树的先序遍历序列和中序遍历序列,输出它的广度优先遍历序列。
Input
第一行为一个整数t(0<t<10),表示测试用例个数。 以下t行,每行输入一个测试用例,包含两个字符序列s1和s2,其中s1为一棵二叉树的先序遍历序列,s2为中序遍历序列。s1和s2之间用一个空格分隔。序列只包含大写字母,并且每个字母最多只会出现一次。
Output
为每个测试用例单独一行输出广度优先遍历序列。
Sample Input
2
DBACEGF ABCDEFG
BCAD CBAD
Sample Output
DBEACGF
BCAD
分析:
本题很直白,就是知道二叉树前序和中序遍历的结果,然后输出广度优先遍历的结果。明白二叉树遍历的递归方式就能很明白的看出解法。
对于每棵树或者子树,他的前序和中序遍历序列都有特定的性质,即前序序列开始的节点一定是根节点。那么中序序列中次节点将序列分城左右两个子序列,分别对应左右子树中序遍历结果。如此左右子树节点数目已知,那么就可以在前序序列中找出左右子树前序遍历结果,这样递归处理就能还原二叉树,然后调用BSF方法即可。
PS:二叉树处理方法大都与递归相关,而且递归的中心在于树或者子树的根,牢牢抓住至一点就能化繁为简。另外,其实前序遍历算是广度优先遍历。
代码:
// Problem#: 1935
// Submission#: 1895987
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
#include <iostream>
#include <string>
#include <queue>
using namespace std;
struct node{
char left;
char right;
}buffer[30];
void tree(string str1, string str2) {
int size = str1.size();
if (size == 0) return ;
int a = str2.find(str1[0]);
int b = str1[0] - 'A';
string l1, l2, r1, r2;
l1 = a ? str1.substr(1, a): "";
l2 = a ? str2.substr(0, a): "";
r1 = (a < size - 1) ? str1.substr(a + 1, size - 1 - a): "";
r2 = (a < size - 1) ? str2.substr(a + 1, size - 1 - a): "";
buffer[b].left = a ? l1[0] : '\0';
buffer[b].right = (a < size - 1) ? r1[0] : '\0';
tree(l1, l2);
tree(r1, r2);
}
void bfs(char c) {
queue<char> tmp;
tmp.push(c);
while (!tmp.empty()) {
char t = tmp.front();
cout << t;
tmp.pop();
node n = buffer[t - 'A'];
if (n.left != '\0') tmp.push(n.left);
if (n.right != '\0') tmp.push(n.right);
}
}
int main() {
int t;
string preOrder, inOrder;
cin >> t;
while (t--) {
cin >> preOrder >> inOrder;
tree(preOrder, inOrder);
bfs(preOrder[0]);
cout << endl;
}
return 0;
}