Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- using namespace std;
- char inorder[27];
- int size;
- char preorder[27];
- int mapx[26];//map
- class node
- {
- public:
- node()
- {
- left = NULL;
- right = NULL;
- }
- char c;
- node* left;
- node* right;
- };
- void postorder(node*);
- int ipost;
- char post[27];
- node* maketree(int ,int);
- int main()
- {
- ifstream fin("heritage.in");
- ofstream fout("heritage.out");
- char c;
- bool second = false;
- int size2 = 0;
- while ( (c = fin.get())!=EOF )
- {
- if (c=='\n')
- {
- second = true;
- continue;
- }
- if (!second)
- {
- inorder[size++] = c;
- }
- else
- {
- preorder[size2++] = c;
- }
- }
- //map the in-order to the index it occurs
- for (int i = 0 ; i<size ;i++)
- {
- mapx[inorder[i]-'A'] = i;
- }
- //make tree
- node* root = maketree(0,size-1);
- //post-order
- postorder(root);
- post[ipost] = NULL;
- fout<<post;
- fout<<endl;
- fin.close();
- fout.close();
- return 0;
- }
- void postorder(node* root)
- {
- if (!root)
- return;
- postorder(root->left);
- postorder(root->right);
- post[ipost++]=root->c;
- }
- int ppos;
- node* maketree(int begin ,int end)
- {
- if (ppos==size)
- return NULL;
- char c = preorder[ppos++];
- if (begin==end&&begin==mapx[c-'A'])
- {
- node* single = new node();
- single->c = c;
- return single;
- }
- else if (mapx[c-'A']>=begin&&mapx[c-'A']<=end)
- {
- node* root = new node();
- root->c = c;
- root->left = maketree(begin,mapx[c-'A']-1);
- root->right = maketree(mapx[c-'A']+1,end);
- return root;
- }
- else
- {
- ppos--;
- return NULL;
- }
- }
Add Comment
Please, Sign In to add comment