您的位置:首页 > 大数据 > 人工智能

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

2017-02-19 11:13 381 查看

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] << ' ';
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  PAT 甲级 二叉树 递归