思路比较简单,就是递归的方法,但是在处理边界条件的时候需要注意一下。
造成错误的原因,可能是对substr函数的实现过程不熟悉,误认为若字符串为空,substr不返回相应的空串,所以导致在写边界条件判断的时候写成了“s1.size()==1”。但事实上,substr可以返回空串,空串的size是0。因此整个函数的过程可以理解为,若整棵树对应的字符串长度为0,就直接返回null,若长度>0,就再分别求左子树和右子树,接到根节点上,虽然左子树或右子树可能为空,也不影响,因为空的时候直接返回null,相当于子树为空。
构造二叉树的过程如下:
相应的C++代码为
#include<iostream>
#include<string>
using namespace std;
typedef struct treenodes {// 树节点
char c;
struct treenodes* l;
struct treenodes* r;
}treenode;
treenode* function(string s1, string s2) {
char s0 = s1[0];
int loc=0;//根节点在中序中的位置
for (loc = 0; loc < s2.size(); loc++) {
if (s2[loc] == s0) {
break;
}
}
if (s1.size() == 0) {
return nullptr;
}
else {
treenode* root = new treenode();
root->c = s0;
string s3 = s1.substr(1, loc);
string s4 = s2.substr(0, loc);
string s5 = s1.substr(loc+1, s1.size()-1-loc);
string s6 = s2.substr(loc + 1, s2.size() - 1 - loc);
root->l = function(s3, s4);
root->r = function(s5, s6);
return root;
}
}
void preorder(treenode* root) {
if (root != nullptr) {
cout << root->c;
preorder(root->l);
preorder(root->r);
}
}
int main() {
string s1, s2;
cin >> s1; // preorder
cin >> s2; // midorder
treenode* root;
root = function(s1, s2);
preorder(root);
}