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

代码写的比较乱,凑合看吧。
#include
#include
#include
#include
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 mid;
vector rev;
typedef vector::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::iterator rit = rev.end() - 1;
	tr.root = new node(rev.back());
	creattree(tr.root, rit, mid.begin(), mid.end() - 1);
	stack 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;
}

你可能感兴趣的:(Openjudge)