AcWing 1576. 再次树遍历
原题链接
简单
作者:
heiyou
,
2020-05-21 23:22:31
,
所有人可见
,
阅读 1025
//push是前序遍历
//pop是中序遍历
#include <iostream>
#include <algorithm>
#include <stack>
#include <unordered_map>
using namespace std;
const int N = 40;
int inorder[N], preorder[N], postorder[N];
int n, index1, index2, index3;
stack<int> stk;
int l[N], r[N];
unordered_map<int, int> pos;
int build(int pl, int pr, int il, int ir)
{
int root = preorder[pl];
int k = pos[root];
if(k > il) l[root] = build(pl + 1, k - 1 - il + pl + 1, il, k - 1);
if(k < ir) r[root] = build(k + pl + 1- il, pr, k + 1, ir);
return root;
}
void dfs(int root)
{
if(l[root]) dfs(l[root]);
if(r[root]) dfs(r[root]);
postorder[index3 ++] = root;
}
int main()
{
cin >> n;
for(int i = 0; i < 2 * n; i ++)
{
string op;
cin >> op;
if(op[1] == 'u')
{
cin >> preorder[index1 ++];
stk.push(preorder[index1 - 1]);
}
else if(op[1] == 'o')
{
int x = stk.top();
//cout << x << endl;
inorder[index2 ++] = x;
pos[x] = index2 - 1;
stk.pop();
}
}
int root = build(0, n - 1, 0, n - 1);
dfs(root);
cout << postorder[0];
for(int i = 1; i < n; i ++) cout << " " << postorder[i];
return 0;
}
易错点:还是有些边界问题处理不好,容易写错
if(k > il) l[root] = build(pl + 1, k - 1 - il + pl + 1, il, k - 1);
这里边界一定要处理好,尤其是k > il 而不是k >= il
写等于的话:pl + 1可能会越界,因为构造左子树的时候是从pl右边的端点开始
都可以啊,主要是我自己会写错,我只是提醒我自己......
if(k < ir) r[root] = build(k + pl + 1- il, pr, k + 1, ir);
这些写不对吗?
if(k < ir) r[root] = build(pr-(ir-k-1), pr, k + 1, ir);
保证前两个的差等于后两个的差不行吗?