1086. Tree Traversals Again (25)[递归+二叉树]

1. 原题: https://www.patest.cn/contests/pat-a-practise/1086

2. 思路:

递归+二叉树的遍历问题
题意:
用栈模拟树的遍历,输出后序
思路:
入栈序列其实是二叉树的前序,出栈序列是中序。
所以,问题就是利用前序和中序输出后序。
显然,用递归处理啦。
已AC

3. 源码:

#include<iostream>
#include<vector>
#include<stack>
#include<string>
using namespace std;

int N;//结点数
vector<int> ino, pre;//分别存储中序和前序的序列
int findPos(int x);//找出前序中的第x个元素在中序的位置
void post(int left, int right, int ro_pos);//输出后序, 参数分别是中序的左、右边界,前序的根位置

int main(void)
{
	//freopen("in.txt", "r", stdin);
	cin >> N;
	stack<int> sta;//栈

	for (int i = 0; i < 2 * N; i++)//读入数据
	{
		string s;
		int data;
		cin >> s;

		if (s[1] == 'u')//构建前序序列
		{
			cin >> data;
			sta.push(data);
			pre.push_back(data);
		}
		else//构建中序序列
		{
			data = sta.top();
			sta.pop();
			ino.push_back(data);
		}
	}
	post(0, N - 1, 0);//递归输出后序

	return 0;
}

int findPos(int x)//找出前序中的第x个元素在中序的位置
{
	int i;
	for (i = 0; i < N; i++)
	{
		if (ino[i] == pre[x])
			break;
	}

	return i;
}

void post(int left, int right, int ro_pos)//参数分别是中序的左、右边界,前序的根位置
{
	if (left > right)//递归终止条件
		return;

	int ino_pos = findPos(ro_pos);
	post(left, ino_pos - 1, ro_pos + 1);//递归左子树
	post(ino_pos + 1, right, (ro_pos + ino_pos - left + 1));//递归右子树

	if (ro_pos == 0)//输出根结点
		cout << pre[ro_pos] << endl;
	else
		cout << pre[ro_pos] << ' ';
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值