PTA-浪漫侧影

该博客主要介绍了如何根据给定的二叉树中序遍历和后序遍历序列来构建二叉树,并进一步计算出二叉树的左视图和右视图。通过递归算法,首先恢复二叉树结构,然后逐层遍历得到每一层的第一个和最后一个节点,分别对应左视图和右视图。输入包括两个整数序列,输出为两个序列分别表示右视图和左视图的结果。
摘要由CSDN通过智能技术生成

题目简述:

给你一个二叉树的中序遍历和后续遍历,让你求出二叉树的左右视图

“侧影”就是从左侧或者右侧去观察物体所看到的内容。例如上图中男生的侧影是从他右侧看过去的样子,叫“右视图”;女生的侧影是从她左侧看过去的样子,叫“左视图”。

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

思路:利用中序和后序的规律 找出每一层从左至右的数据 然后遍历输出第一个或者最后一个

注意点:在往左边递归时,对于下一个需要寻找的目标 位于后续遍历的第num-1-(en-i)

num:用于记录每一次需要在中序寻找的数据位于后序数组中的下标

st:下一次递归的开始 en:下一次递归的结束 depth:深度

AC代码:

#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
#include<string>
#include<set>
#include<math.h>
#include<stdio.h>
#include<stack>
#include<queue>
//#include<bits/stdc++.h>
using namespace std;

int a[25];
int b[25];
vector<int>dep[25];
int maxdepth = 0;

void xp(int num, int st, int en, int depth)
{
	if (st > en)
	{
		return;
	}
	if (maxdepth < depth)
	{
		maxdepth = depth;
	}
	dep[depth].push_back(b[num]);
	int i = st;
	for (; i <= en; i++)
	{
		if (a[i] == b[num])
		{
			break;
		}
	}
	xp(num - 1 - (en - i), st, i - 1, depth + 1);
	xp(num - 1, i + 1, en, depth + 1);
	return;
}

int main()
{
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
	}
	for (int i = 1; i <= n; i++)
	{
		cin >> b[i];
	}
	xp(n, 1, n, 1);
	cout << maxdepth << endl;
	cout << "R: " << dep[1][0];
	for (int i = 2; i <= maxdepth; i++)
	{
		cout << " " << dep[i].back();
	}
	cout << endl;
	cout << "L: " << dep[1][0];
	for (int i = 2; i <= maxdepth; i++)
	{
		cout << " " << dep[i].front();
	}
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值