已知后序与中序输出前序(先序)
后序:2 3 1 5 7 6 4(左右根)
中序:1 2 3 4 5 6 7(左根右)
分析:由于后续的最后一个节点总是根节点(root),从中序中找出根节点坐标i,i把中序分成左右子树。依次类推。。。
后序序列左子树root = root - 1 + i - r
后序序列右子数root = root - 1
/*
*/
#include <cstdio>
using namespace std;
int post[] = {2, 3, 1, 5, 7, 6, 4};
int in[] = {1, 2, 3, 4, 5, 6, 7};
void pre(int root, int l, int r) {
if(l > r) return ;
int i = l;
while(i < r && in[i] != post[root]) i++;
printf("%d ", post[root]);
pre(root - 1 - r + i, l, i - 1);
pre(root - 1, i + 1, r);
}
int main() {
pre(6, 0, 6);
return 0;
}
已知前序(先序)与中序输出后序
先序: 4 1 3 2 6 5 7(根左右)
中序:1 2 3 4 5 6 7(左根右)
分析:由于先序序列第一个节点总是根节点(root),因此在中序中找出根节点的坐标i,i把中序分成左右子树。
先序左子树root = root - 1;
先序右子数root = root + i - l + 1
#include <cstdio>
using namespace std;
int pre[] = {4, 1, 3, 2, 6, 5, 7};
int in[] = {1, 2, 3, 4, 5, 6, 7};
void post(int root, int l, int r) {
if(l > r)
return ;
int i = l;
while(i < r && in[i] != pre[root]) i++;
post(root + 1, l, i - 1);
post(root + 1 + i - l, i + 1, r);
printf("%d ", pre[root]);
}
int main() {
post(0, 0, 6);
return 0;
}