L2-006. 树的遍历

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 }

 

转载于:https://www.cnblogs.com/Simon-X/p/6631705.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值