思路简介:
①先序遍历中第一个字母即为根节点,在中序遍历中找到根节点的位置
②把中序遍历的字符串序列从根节点分成两部分,左侧一部分构建左子树,右侧一部分构建右子树
③在②的基础上在先序遍历中也找到构建左右子树的部分
④递归还原二叉树
⑤后序遍历输出即可
#include <iostream>
#include <string>
using namespace std ;
struct node
{
node *left ;
node *right ;
char data ;
};
node *reroot(string s1, string s2)
{
node *root = NULL ;
//建立新的结点
if(s1.size() > 0 )
{
root = new node() ;
root -> data = s1[0] ;
root -> left = NULL ;
root -> right = NULL ;
}
if( s1.size() > 1 )
{
//找到根节点
int root_position = s2.find(root->data);
//重建左子树
string pre_left = s1.substr(1,root_position);
string in_left = s2.substr(0,root_position) ;
root -> left = reroot(pre_left,in_left);
//重建右子树
string pre_right = s1.substr(root_position + 1, s1.size());
string in_right = s2.substr(root_position + 1 ,s2.size()) ;
root -> right = reroot(pre_right,in_right);
}
return root ;
}
//后序遍历
void postorder(node *root)
{
if(root)
{
postorder(root->left);
postorder(root->right);
cout << root -> data ;
}
}
int main()
{
int number = 0 ;
cin >> number ;
for(int i = 0 ; i < number ; i ++ )
{
string preorder ;
string inorder ;
cin >> preorder >> inorder ;
node *root = reroot(preorder,inorder);
postorder(root);
cout << endl ;
}
}