【Openjudge】由中根序列和后根序列重建二叉树

来源:互联网 发布:mac制作win7安装u盘 编辑:程序博客网 时间:2024/05/24 04:42
代码写的比较乱,凑合看吧。
#include<iostream>#include<stack>#include<vector>#include<algorithm>using namespace std;class node{public:int num;node *left;node *right;public:node(int n = 0){num = n;left = NULL;right = NULL;}};class Tree{public:node* root;public:Tree (node *n = NULL){root = n;if(n != NULL){root->num = n->num;root->left = n->left;root->right = n->right;}}};vector<int> mid;vector<int> rev;typedef vector<int>::iterator ite;ite creattree(node* nroot, ite rroot, ite mleft, ite mright){nroot->num = *rroot;ite mid = find(mleft, mright, *rroot);ite bound  = rroot;if (mid != mright){nroot->right = new node;bound = creattree(nroot->right, rroot - 1, mid + 1, mright);}if ( mid != mleft){nroot->left = new node;bound = creattree(nroot->left, bound - 1, mleft, mid - 1);}return bound;}int main(){int n;char c;while (cin >> n){mid.push_back(n);c = cin.get();if (c == '\n'){break;}}while (cin >> n){rev.push_back(n);c = cin.get();if (c == '\n')break;}Tree tr;vector<int>::iterator rit = rev.end() - 1;tr.root = new node(rev.back());creattree(tr.root, rit, mid.begin(), mid.end() - 1);stack<node*> travel;travel.push(NULL);node * pointer = tr.root;while (pointer){cout << pointer->num << ' ';if (pointer->right){travel.push(pointer->right);}if (pointer->left){pointer = pointer->left;}else{pointer = travel.top();travel.pop();}}return 0;}

阅读全文
0 0