L2-006. 树的遍历
时间限制 400ms 内存限制 65536 kB
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(<=30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
7 2 3 1 5 7 6 4 1 2 3 4 5 6 7
输出样例:
4 1 6 3 5 7 2
题解:
水题,直接模拟就好……
代码 C++:
1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 #define INF 0x7F7F7F7F 5 #define MX 35 6 int pst[MX], iPst, ode[MX], tre[MX][3], nTre, n; 7 void red(){ 8 int i, tmp; 9 scanf("%d", &n); 10 for (i = 0; i < n; ++i) scanf("%d", pst + i); 11 for (i = 0; i < n; ++i) scanf("%d", &tmp), ode[tmp] = i; 12 } 13 int bul(int now, int lOde, int rOde){//[l, r] 14 int iOde = ode[pst[iPst]]; 15 if (iOde < lOde || rOde < iOde){ --nTre; return INF; } 16 if (tre[now][0] == INF) tre[now][0] = pst[iPst--]; 17 tre[now][2] = bul(tre[now][2] = ++nTre, iOde + 1, rOde); 18 tre[now][1] = bul(tre[now][1] = ++nTre, lOde, iOde - 1); 19 return now; 20 } 21 int main() { 22 memset(tre, INF, sizeof tre); 23 red(); 24 bul(0, 0, iPst = --n); 25 int now, i; 26 printf("%d", pst[n]); 27 std::queue<int> q; for (i = 1; i < 3; ++i) q.push(tre[0][i]); 28 while (!q.empty()){ 29 now = q.front(); q.pop(); 30 if (now == INF) continue; 31 printf(" %d", tre[now][0]); 32 for (i = 1; i < 3; ++i) q.push(tre[now][i]); 33 } 34 return 0; 35 }