“侧影”就是从左侧或者右侧去观察物体所看到的内容。例如上图中男生的侧影是从他右侧看过去的样子,叫“右视图”;女生的侧影是从她左侧看过去的样子,叫“左视图”。
520 这个日子还在打比赛的你,也就抱着一棵二叉树左看看右看看了……
我们将二叉树的“侧影”定义为从一侧能看到的所有结点从上到下形成的序列。例如下图这棵二叉树,其右视图就是 { 1, 2, 3, 4, 5 },左视图就是 { 1, 6, 7, 8, 5 }。
于是让我们首先通过一棵二叉树的中序遍历序列和后序遍历序列构建出一棵树,然后你要输出这棵树的左视图和右视图。
输入格式:
输入第一行给出一个正整数 N (≤20),为树中的结点个数。随后在两行中先后给出树的中序遍历和后序遍历序列。树中所有键值都不相同,其数值大小无关紧要,都不超过 int 的范围。
输出格式:
第一行输出右视图,第二行输出左视图,格式如样例所示。
输入样例:
8
6 8 7 4 5 1 3 2
8 5 4 7 6 3 2 1
样例:">输出样例:
R: 1 2 3 4 5
L: 1 6 7 8 5
感谢用户DSA修正数据!
#include <bits/stdc++.h>
using namespace std;
int n, s1[25], s2[25];
map<int, int> m;
vector<int> v, a, b;
void f(int p1, int p2, int q1, int q2, int index)
{
if (p1 > p2 || q1 > q2)
return;
int i = p1;
m[index] = s2[q2];
while (s1[i] != s2[q2])
i++;
int cnt = i - p1; //左子树个数
f(p1, i - 1, q1, q1 + cnt - 1, 2 * index + 1);
f(i + 1, p2, q1 + cnt, q2 - 1, 2 * index + 2);
}
void dfs(int root)
{
queue<int> q;
q.push(root);
while (!q.empty())
{
queue<int> temp;
while (!q.empty())
{
temp.push(q.front());
q.pop();
}
v.clear();
while (!temp.empty())
{
int front = temp.front();
v.push_back(front);
if (m.find(front * 2 + 1) != m.end())
q.push(front * 2 + 1);
if (m.find(front * 2 + 2) != m.end())
q.push(front * 2 + 2);
temp.pop();
}
a.push_back(m[v[0]]), b.push_back(m[v[v.size() - 1]]);
}
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
cin >> s1[i];
for (int i = 0; i < n; i++)
cin >> s2[i];
f(0, n - 1, 0, n - 1, 0);
dfs(0);
cout << "R:";
for (auto i : b)
{
cout << ' ' << i;
}
cout << endl;
cout << "L:";
for (auto i : a)
{
cout << ' ' << i;
}
return 0;
}