重建
#include<iostream>
#include<stack>
#include<string>
using namespace std;
struct _node{
char data;
_node *left, *right;
_node():data(0), left(NULL), right(NULL){};
};
void build_tree(_node *root, string &preOrders, string &inOrders, int &preOrderpos, int inOrderleft, int inOrderright){
root->data = preOrders[preOrderpos];
int inOrdermid = inOrders.find(root->data);
if (inOrderleft < inOrdermid){
root->left = new _node;
preOrderpos ++ ;
build_tree(root->left, preOrders, inOrders, preOrderpos, inOrderleft, inOrdermid);
}
if (inOrdermid < inOrderright - 1){
root->right = new _node;
preOrderpos ++;
build_tree(root->right, preOrders, inOrders, preOrderpos, inOrdermid + 1, inOrderright);
}
}
int main()
{
string preOders, inOrders;
while (cin >> preOders >> inOrders){
_node* root = new _node;
int pos = 0;
build_tree(root, preOders, inOrders, pos, 0, preOders.length());
//pastOrder travel
stack<_node*> s_;
stack<int> tag;
_node* pointer = root;
int t;
while (!s_.empty() || pointer){
while(pointer){
s_.push(pointer);
tag.push(1);
pointer = pointer->left;
}
pointer = s_.top(); s_.pop();
t = tag.top(); tag.pop();
if (t == 1 && pointer->right){
s_.push(pointer);
tag.push(2);
pointer = pointer->right;
}
else{
cout << pointer->data;
pointer = NULL;
}
}
cout << endl;
}
}