解法:
首先脑子里有画面
然后
二叉树中已知前序和中序,画图求后序(超简单!!!)_已知二叉树的先序和中序序列,画出二叉树,并写出后序遍历次序。-CSDN博客
理论知识都清楚了,以先序数组第一个元素作为切割元素,先切中序数组,再根据中序数组来切先序数组(依据中序数组和先序数组的长度大小一样),一层一层的切割下去,每次先序数组第一个元素就是根节点。
测试:in是中序,pre是先序
代码:
#include<iostream>
#include<vector>
using namespace std;
struct treeNode {
char val;
treeNode* left;
treeNode* right;
treeNode(char x) :val(x), left(NULL), right(NULL) {};
};
treeNode* trans(string& pre, string& in) {
if (pre.size() == 0) return NULL;
char val = pre[0];
treeNode* root = new treeNode(val);
//if (pre.size() == 1) return root;
int p=0;
for (; p < in.size(); p++) {
if (in[p] == val)
break;
}
string lin, rin;
for (int i = 0; i < p; i++) lin += in[i];
for (int i = p + 1; i < in.size(); i++) rin += in[i];
string lpre, rpre;
for (int i = 1; i <= p; i++) lpre += pre[i];
for (int i = p+1; i < pre.size(); i++) rpre += pre[i];
cout << "lin:";
for (char i : lin) {
cout << i << " ";
}
cout << endl;
cout << "lpre:";
for (char i : lpre) {
cout << i << " ";
}
cout << endl;
cout << "rin:";
for (char i : rin) {
cout << i << " ";
}
cout << endl;
cout << "rpre:";
for (char i : rpre) {
cout << i << " ";
}
cout << endl;
root->left = trans(lpre, lin);
root->right = trans(rpre, rin);
return root;
}
void dfs(treeNode* root) {
if (root == NULL) return;
dfs(root->left);
dfs(root->right);
cout << root->val;
return;
}
int main() {
string prea, ina;
cin >> ina >> prea;
treeNode* root=trans(prea, ina);
dfs(root);
return 0;
}
对叶节点可以做剪枝优化。
那么同理:
已知中序和后序构造二叉树也是一样,只是首元素变成了尾元素。
ps:交题把日志(打印的测试数据)去掉
#include<iostream>
#include<vector>
using namespace std;
struct treeNode {
char val;
treeNode* left;
treeNode* right;
treeNode(char x) :val(x), left(NULL), right(NULL) {};
};
treeNode* trans(string& pre, string& in) {
if (pre.size() == 0) return NULL;
char val = pre[0];
treeNode* root = new treeNode(val);
//if (pre.size() == 1) return root;
int p=0;
for (; p < in.size(); p++) {
if (in[p] == val)
break;
}
string lin, rin;
for (int i = 0; i < p; i++) lin += in[i];
for (int i = p + 1; i < in.size(); i++) rin += in[i];
string lpre, rpre;
for (int i = 1; i <= p; i++) lpre += pre[i];
for (int i = p+1; i < pre.size(); i++) rpre += pre[i];
root->left = trans(lpre, lin);
root->right = trans(rpre, rin);
return root;
}
void dfs(treeNode* root) {
if (root == NULL) return;
dfs(root->left);
dfs(root->right);
cout << root->val;
return;
}
int main() {
string prea, ina;
cin >> ina >> prea;
treeNode* root=trans(prea, ina);
dfs(root);
return 0;
}