题目大意:给定二叉树先序和中序遍历,输出二叉树后序遍历。
方法:将英文字母映射为数字,利用数组存储,先序第一个节点是父节点,然后再从中序遍历中找到位置。注意边界。代码也很简单一次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;
}