中序遍历 + 后序遍历 = 先序遍历
a数组保存中序遍历,b数组保存后序遍历
每次都查找根,在后序遍历中查找跟要倒着来,自然因为后序是 左 → 右 → 根
因为先序是根 → 左 → 右,所以先输出根,再递归左子树,再递归右子树。
此图转载自他人博客,文末给出链接。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
char a[100],b[100];
int la,lb;
void dg(int n,int m) {
if(n > m){
return;
}
int pos = -1;
for(int i = lb-1; i>=0; i--) {
for(int j = n; j<=m; j++) {
if(a[j] == b[i]){
pos = j;
break;
}
}
if(pos != -1){
break;
}
}
cout<<a[pos];
dg(n,pos-1);
dg(pos+1,m);
}
int main() {
scanf("%s%s", a, b);
la = strlen(a);
lb = strlen(b);
dg(0,la-1);
return 0;
}
中序 + 层序 = 先序
中序在前,层序在后
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
char a[100],b[100];
int la,lb;
void dg(int n,int m) {
if(n > m) {
return;
}
int pos = -1,i;
for(i = 0; i<=lb - 1; i++) {
for(int j = n; j<=m; j++) {
if(b[j] == a[i]) {
pos = j;
break;
}
}
if(pos != -1) {
break;
}
}
putchar(a[i]);
dg(n,pos-1);
dg(pos+1,m);
}
int main() {
scanf("%s%s", b, a);
la = strlen(a);
lb = strlen(b);
dg(0,la-1);
return 0;
}
中序 + 层序 = 后序
忘记怎么做了,待日后理解!
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
char a[100],b[100];
int la,lb;
void dg(int n,int m) {
if(n > m) {
return;
}
int pos = -1;
for(int i = lb-1; i>=0; i--) {
for(int j = n; j<=m; j++) {
if(a[j] == b[i]) {
pos = j;
break;
}
}
if(pos != -1) {
break;
}
}
dg(n,pos-1);
dg(pos+1,m);
cout<<a[pos];
}
int main() {
scanf("%s%s", a, b);
la = strlen(a);
lb = strlen(b);
dg(0,la-1);
return 0;
}
先序 + 中序 = 后序
由于先序是 根 → 左 → 右,所以遍历的时候是从左到右,不同于后序,不用倒着来。
输入时,前序在前,中序在后
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
char a[100],b[100];
int la,lb;
void dfs(int n,int m) {
if(n > m) {
return;
}
int pos = -1,i;
for(i = 0; i<=la - 1; i++) {
for(int j = n; j<=m; j++) {
if(b[j] == a[i]) {
pos = j;
break;
}
}
if(pos != -1) {
break;
}
}
dfs(n,pos-1);
dfs(pos+1,m);
cout<<a[i];
}
int main() {
scanf("%s%s",a,b);
la = strlen(a);
lb = strlen(b);
dfs(0,la-1);
return 0;
}