1. 程式人生 > >Uva536 Tree Recovery二叉樹重建(先序和中序確定二叉樹,後序輸出)

Uva536 Tree Recovery二叉樹重建(先序和中序確定二叉樹,後序輸出)

題目大意:給定二叉樹先序和中序遍歷,輸出二叉樹後序遍歷。

方法:將英文字母對映為數字,利用陣列儲存,先序第一個節點是父節點,然後再從中序遍歷中找到位置。注意邊界。程式碼也很簡單一次ac。

#include<iostream>
#include <string>
#include <string.h>
using namespace std;
string preorder,inorder;
int lefttree[1000], righttree[1000];
int build(int preleft,int preright,int inleft,int inright) {
	if (preleft> preright)return -1;
	int index = inorder.find(preorder[preleft],inleft);
	int l1 = index - inleft;
	int r1 = inright - index;
	lefttree[preorder[preleft] - 'A']=build( preleft + 1, preleft + l1, inleft, index - 1);
	righttree[preorder[preleft] - 'A']=build( preleft + l1 + 1, preleft + l1 + r1, index+1, inright);
	return preorder[preleft]-'A';
}
void printTree(int root) {
	if (root == -1)return;
	printTree(lefttree[root]);
	printTree(righttree[root]);
	cout << (char)(root + 'A');
}
int main()
{
while (cin >> preorder && cin >> inorder) {
	memset(righttree, -1, sizeof(righttree));
	memset(lefttree, -1, sizeof(lefttree));
	build(0, preorder.length()-1, 0, preorder.length()-1);
	printTree(preorder[0]-'A');
	cout << endl;
}
	return 0;
}