原题地址
AC代码
#include <iostream>
#include <algorithm>
#include <string>
#include <utility>
using namespace std;
int find(char n,string x){
for (int i = 0; i < x.length(); ++i) {
if(n==x[i])return i;
}
return -1;
}
class node{
public:
char data;
node *left;
node *right;
};
node *generate(string a,string b){
node* ptr = new node;
int index = find(a[0],b);
ptr->data = a[0];
if(a.length()==1){
ptr->right=ptr->left=NULL;
}else if(a.length()==2){
if(index ==1){
ptr->left = generate(a.substr(1,1),b.substr(0,1));
ptr->right = NULL;
}else if(index == 0){
ptr->left = NULL;
ptr->right = generate(a.substr(1,1),b.substr(1,1));
}
}else {
if(index ==b.length()-1){
ptr->left = generate(a.substr(1, index), b.substr(0, index));
ptr->right = NULL;
}else if(index == 0){
ptr->left = NULL;
ptr->right = generate(a.substr(index + 1, b.length() - 1 - index),b.substr(index + 1, b.length() - 1 - index));
}
else {
ptr->left = generate(a.substr(1, index), b.substr(0, index));
ptr->right = generate(a.substr(index + 1, b.length() - 1 - index),b.substr(index + 1, b.length() - 1 - index));
}
}
return ptr;
}
void print(node *ptr){
if(ptr->left!=NULL)print(ptr->left);
if(ptr->right!=NULL)print(ptr->right);
cout<<ptr->data;
}
int main() {
string a,b;
while(cin>>a>>b){
node *root = generate(a,b);
print(root);
cout<<endl;
}
return 0;
}
题解和题目思路
因为不是dalao所以只能乖乖的先把二叉树还原出来然后再后序遍历打印出来(捂脸)
node *generate(string a,string b)
这个函数通过递归的方式来生成给定序列下的二叉树,原理如下:
以字符串A的第一个元素A[0]在字符串B中出现的位置为分界点,A[0]即为当前树的根节点,B中A[0]之前的元素为A[0]左子树的元素,之后的元素为右子树的元素,根据两端子树的元素多少在A中从A[1]开始,按照先左后右的顺序取出对应长度的字串,如果元素数量为0则不取,将左右子树分别对应的两组字符串组(其中每组包含两对字符串)再分别丢进生成函数中,返回值指向当前根节点的左右子节点,由此递归即可生成原树
//菜还是我菜想不到那些dalao的解法