#include <iostream>
#include <vector>
using namespace std;
class node
{
public:
node()
{
id =0;
Lchild = nullptr;
Mchild = nullptr;
Rchild = nullptr;
}
node(int id)
{
this->id = id;
Lchild = nullptr;
Mchild = nullptr;
Rchild = nullptr;
}
int id;
node* Lchild;
node* Mchild;
node* Rchild;
};
node* build(vector<int> preOrder, vector<int> inOrder, int start, int end);
void findIndex(int id, vector<int> inOrder, int strat, int end, int &pos1, int &pos2);
void postOrder(node* root);
int main()
{
ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
int n;
cin >> n;
vector<int> preOrder, inOrder;
preOrder.resize(n);
inOrder.resize(n * 2);
for (int i = 0;i < n;i++)
{
int num;
cin >> num;
preOrder[i] = num;
}
for (int i = 0;i < n * 2;i++)
{
int num;
cin >> num;
inOrder[i] = num;
}
node* root = build(preOrder, inOrder, 0, n * 2 - 1);
postOrder(root);
system("pause");
return 0;
}
node* build(vector<int> preOrder, vector<int> inOrder, int start, int end)
{
static int preOrder_index = 0;
if (preOrder_index == preOrder.size())
return nullptr;
if (start >= end)
return nullptr;
node* r = new node(preOrder[preOrder_index]);
preOrder_index++;
if (start == end - 1)
return r;
int pos1 = -1, pos2 = -1;
findIndex(r->id, inOrder, start, end, pos1, pos2);
r->Lchild = build(preOrder, inOrder, start, pos1 - 1);
r->Mchild = build(preOrder, inOrder, pos1 + 1, pos2 - 1);
r->Rchild = build(preOrder, inOrder, pos2 + 1, end);
return r;
}
void findIndex(int id, vector<int> inOrder, int start, int end, int &pos1, int &pos2)
{
for (int i = start;i <= end;i++)
{
if (id == inOrder[i])
{
if (pos1 == -1)
{
pos1 = i;
continue;
}
else
{
pos2 = i;
break;
}
}
}
}
void postOrder(node* root)
{
if (root != nullptr)
{
postOrder(root->Lchild);
postOrder(root->Mchild);
postOrder(root->Rchild);
cout << root->id << " ";
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCgpjbGFzcyBub2RlCnsKcHVibGljOgoJbm9kZSgpCgl7CgkJaWQgPTA7CgkJTGNoaWxkID0gbnVsbHB0cjsKCQlNY2hpbGQgPSBudWxscHRyOwoJCVJjaGlsZCA9IG51bGxwdHI7Cgl9Cglub2RlKGludCBpZCkKCXsKCQl0aGlzLT5pZCA9IGlkOwoJCUxjaGlsZCA9IG51bGxwdHI7CgkJTWNoaWxkID0gbnVsbHB0cjsKCQlSY2hpbGQgPSBudWxscHRyOwoJfQoJaW50IGlkOwoJbm9kZSogTGNoaWxkOwoJbm9kZSogTWNoaWxkOwoJbm9kZSogUmNoaWxkOwp9OwoKbm9kZSogYnVpbGQodmVjdG9yPGludD4gcHJlT3JkZXIsIHZlY3RvcjxpbnQ+IGluT3JkZXIsIGludCBzdGFydCwgaW50IGVuZCk7CnZvaWQgZmluZEluZGV4KGludCBpZCwgdmVjdG9yPGludD4gaW5PcmRlciwgaW50IHN0cmF0LCBpbnQgZW5kLCBpbnQgJnBvczEsIGludCAmcG9zMik7CnZvaWQgcG9zdE9yZGVyKG5vZGUqIHJvb3QpOwoKCmludCBtYWluKCkKewoJaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CglzdGQ6OmNpbi50aWUobnVsbHB0cik7CglpbnQgbjsKCWNpbiA+PiBuOwoJdmVjdG9yPGludD4gcHJlT3JkZXIsIGluT3JkZXI7CglwcmVPcmRlci5yZXNpemUobik7Cglpbk9yZGVyLnJlc2l6ZShuICogMik7Cglmb3IgKGludCBpID0gMDtpIDwgbjtpKyspCgl7CgkJaW50IG51bTsKCQljaW4gPj4gbnVtOwoJCXByZU9yZGVyW2ldID0gbnVtOwoJfQoJZm9yIChpbnQgaSA9IDA7aSA8IG4gKiAyO2krKykKCXsKCQlpbnQgbnVtOwoJCWNpbiA+PiBudW07CgkJaW5PcmRlcltpXSA9IG51bTsKCX0KCglub2RlKiByb290ID0gYnVpbGQocHJlT3JkZXIsIGluT3JkZXIsIDAsIG4gKiAyIC0gMSk7Cglwb3N0T3JkZXIocm9vdCk7CgoJc3lzdGVtKCJwYXVzZSIpOwoJcmV0dXJuIDA7Cn0KCm5vZGUqIGJ1aWxkKHZlY3RvcjxpbnQ+IHByZU9yZGVyLCB2ZWN0b3I8aW50PiBpbk9yZGVyLCBpbnQgc3RhcnQsIGludCBlbmQpCnsKCXN0YXRpYyBpbnQgcHJlT3JkZXJfaW5kZXggPSAwOwoJaWYgKHByZU9yZGVyX2luZGV4ID09IHByZU9yZGVyLnNpemUoKSkKCQlyZXR1cm4gbnVsbHB0cjsKCglpZiAoc3RhcnQgPj0gZW5kKQoJCXJldHVybiBudWxscHRyOwoKCW5vZGUqIHIgPSBuZXcgbm9kZShwcmVPcmRlcltwcmVPcmRlcl9pbmRleF0pOwoJcHJlT3JkZXJfaW5kZXgrKzsKCWlmIChzdGFydCA9PSBlbmQgLSAxKQoJCXJldHVybiByOwoKCWludCBwb3MxID0gLTEsIHBvczIgPSAtMTsKCWZpbmRJbmRleChyLT5pZCwgaW5PcmRlciwgc3RhcnQsIGVuZCwgcG9zMSwgcG9zMik7CgoJci0+TGNoaWxkID0gYnVpbGQocHJlT3JkZXIsIGluT3JkZXIsIHN0YXJ0LCBwb3MxIC0gMSk7CglyLT5NY2hpbGQgPSBidWlsZChwcmVPcmRlciwgaW5PcmRlciwgcG9zMSArIDEsIHBvczIgLSAxKTsKCXItPlJjaGlsZCA9IGJ1aWxkKHByZU9yZGVyLCBpbk9yZGVyLCBwb3MyICsgMSwgZW5kKTsKCglyZXR1cm4gcjsKfQoKdm9pZCBmaW5kSW5kZXgoaW50IGlkLCB2ZWN0b3I8aW50PiBpbk9yZGVyLCBpbnQgc3RhcnQsIGludCBlbmQsIGludCAmcG9zMSwgaW50ICZwb3MyKQp7Cglmb3IgKGludCBpID0gc3RhcnQ7aSA8PSBlbmQ7aSsrKQoJewoJCWlmIChpZCA9PSBpbk9yZGVyW2ldKQoJCXsKCQkJaWYgKHBvczEgPT0gLTEpCgkJCXsKCQkJCXBvczEgPSBpOwoJCQkJY29udGludWU7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwb3MyID0gaTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQp9Cgp2b2lkIHBvc3RPcmRlcihub2RlKiByb290KQp7CglpZiAocm9vdCAhPSBudWxscHRyKQoJewoJCXBvc3RPcmRlcihyb290LT5MY2hpbGQpOwoJCXBvc3RPcmRlcihyb290LT5NY2hpbGQpOwoJCXBvc3RPcmRlcihyb290LT5SY2hpbGQpOwoJCWNvdXQgPDwgcm9vdC0+aWQgPDwgIiAiOwoKCX0KfQ==